본문 바로가기

Coding Note

[WPF] User Dependency Property


지난 글에 이어, 실제로 나만의 property를 만들어보자.

Dependency Property의 등록
dependency property는 DependencyPeoperty클래스로 구성된 인스턴스로 선언되며 DependencyProperty.Register를 통해 등록된다. 그리고 이 인스턴스는 DependencyMatadata를 포함하고, 내부적으로 DependencyObject를 통해서 실제값에 접근한다.  - 가 저번 글의 핵심이다. 이 흐름대로 property를 만들고 사용할 수 있을 것 같다.

user dependency property를 등록하려면, 먼저 DependencyProperty를 인스턴스화 하는데, 이때 만들어지는 property는 언제나 사용될 수 있어야하고, property를 가지는 객체가 생성되기 전이더라도 접근할 수 있어야 한다. 그렇기 때문에 static 키워드를 붙이며 공유되는 속성이기 때문에 public 접근지정자를 주는것을 관습으로 삼고있다. 그리고 readonly키워드로 선언되어있는데, static생성자에서만 초기화될 수 있다는 의미겠다.

긴 글보단 짧은 코드가 이해하긴 편할 듯 하다. 개념도 중요하지만 개념또한 실제로 사용해봐야 이해가 되는 법이니,, 
아래 코드는 DependencyProperty가 어떻게 인스턴스화되는지 보여준다.

// ...in some class..
 public static readonly DependencyProperty TestPropProperty;
// ...
이렇게 선언된 dependency property는 static 생성자 내에서 초기화되어야 한다. 그런데 dependency property의 초기화는 조금 남다르다. DependencyProperty의 Register라는 static member method를 통해서 property의 register가 이루어져야 한다. 이렇게 등록된 property만 DependencyObject에서 참조하여 값을 평가할 수 있기때문이다. 그럼 등록되는 과정을 보자.
// ...
 TestPropProperty = DependencyProperty.Register("TestProp", typeof(String), typeof(FrameworkElement));
// ...

여기에 추가로 awner에 대한 메타데이터와 valid check callback 함수를 추가할 수 있다.

다음으로 Property Wrapper를 추가해준다.

// ... in class..
public String TestProp{
    get{ return (String)GetValue(TestPropProperty); }
    set{ SetValue(TestPropProperty, value); }
}
// ...

wrapper까지 추가했다면, dependency property는 다 만들어진 것이다.
이 과정은 정형화 되어있기때문에 한번만 해보면 어렵지 않다. prop으로 등록해둬도 좋은 방법일듯 하다.

아래 소스는 나만의 dependency property를 활용해서 히든텍스트라는 property를 만들어봤다.
구지 이렇게 하지 않아도 이런 기능은 구현할 수 있겠지만, dependency property를 만들고 적용시켜보는데는 괜찮은 예제가 될 듯 하다.



 

'Coding Note' 카테고리의 다른 글

[CUDA] syntax highlighting at visual studio 2010  (1) 2012.03.08
[CUDA] visual studio 2010 configuration at x64  (0) 2012.03.08
[WPF] Dependency Property  (0) 2012.01.21
[WPF] Layout  (2) 2012.01.20
[WPF] Properties  (2) 2012.01.20