2

하나의 DP로 사용자 정의 컨트롤을 만들었습니다. 이제 5 번 내 페이지에서 그 UC를 사용하고 내 질문은, DP는 단지 하나의 인스턴스를 만들 수 있도록 정적 속성입니다. 이제 5 가지 컨트롤에 대한 값이 어떻게 유지 될까요?종속성 속성 값 보유 방법

답변

9

종속성 속성은 유형별로 만들어지며 필요한 경우 사용자 지정할 수 있습니다. 따라서 화면에 20 개의 버튼이 있다고 가정 해 봅시다. 점유 한 속성의 저장 공간은 하나의 버튼만큼 좋습니다.

DependencyObject에 두 해시 유지 부재 :

  • 한 정적

개인 정적 해시 테이블 _staticProperties = 새로운 해시 테이블();

  • 또 다른 비 정적.

개인 Hashtable 속성 = 새 Hashtable();

정적 멤버는 기본값의 DP (모든 유형에 대해 하나)와 비 정적 멤버 저장소 값을 변경 한 값을 저장합니다.

dp의 SetValue 메소드를 호출하면 기본적으로 비 정적 HashTable에 항목이 추가됩니다. 그리고 GetValue가 호출 될 때 DependencyObject는 먼저 비 정적 HashTable에 키가 있는지 검사합니다. 가 발견되면 다음

  • DP 그것이 변경된 시간까지 값을 보유하지 않고, 값이 다른 사람은 정적 멤버의 값을 (기본값 인)

    그래서 돌려줍니다.

  • DP는 정적이므로 앱에서 값을 볼 수 있습니다. 그렇기 때문에 인스턴스를 생성하는 대신 DP를 등록해야합니다. DP는 DependencyObject에 클래스에서 선언 된 해시 가치를 보유하고

  • , 당신은 하나를 등록하는 동안 소유자의 유형을 통과해야합니다.

또한 내 블로그에 여기를 볼 수 있습니다 How Dependency Property holds value

1

당신이 재산의 단 하나의 정의는 당신이 정적 멤버를 사용하여 정의를 만들 이유가있는 DependencyProperty를 선언합니다.

그러나 DependencyProperty에 대한 값이있는 각 개체는 고유 한 속성 값을 가져옵니다. 클래스에 DependencyProperty을 만드는 일반적인 패턴은 속성 setter 및 getter를 만드는 것이며이 속성은 정적이 아닙니다.

public class MyObject : DependencyObject { 

    public static readonly DependencyProperty SomethingProperty = 
    DependencyProperty.Register(
     "Something", 
     typeof(String), 
     typeof(MyObject), 
     new PropertyMetadata(default(String)) 
    ); 

    public String Something { 
    get { return (String) GetValue(SomethingProperty); } 
    set { SetValue(SomethingProperty, value); } 
    } 

} 

속성 정의가 정적 인 것을 알 수 있지만, 실제 속성 :

DependencyProperty를 정의하는 기본 패턴이있다.

MyObject의 각 인스턴스에는 Something 종속성 속성 값이 있습니다.