티스토리 뷰

오늘은 WPF / Dependency Property에 대해서 포스팅 해보려고 한다. 

WPF를 사용하다보면, Button, ListBoxItem, UserControl 등 이미 정의되어 있는 컨트롤을 상속받아 커스텀화된 새로운 컨트롤을 만드는 경우가 심심치 않게 있다. 

이 때 "커스텀"할때 반드시 필요하게 되는 것이 Dependency Property 이다. 

이를 잘 쓰면, UIElment의 재사용성이 올라가고, 일관성 있는 프로젝트를 만드는데 도움이 된다. 

이걸 만들다 보면 결국에는 내가 데이터를 바인딩 해놓은 아주 많은 속성들이 Dependency Property와 연결 되어 있다는 사실을 깨닫게 되는데....!

 

https://docs.microsoft.com/en-us/dotnet/desktop/wpf/properties/dependency-properties-overview?view=netdesktop-6.0 

 

Dependency properties overview - WPF .NET

Learn about the WPF property system and the capabilities of a dependency property, which is a property that's backed by the WPF property system.

docs.microsoft.com

위는 Dependency Property에 대한 공식 문서이다. 한국어도 영어도 뭐.. 잘 이해는 안가지만, Dependency Property의 가장 강력한 기능은 콜백이라고 생각한다. 

  • Self-contained validation.
  • Default values.
  • ★ Callbacks that monitor changes to other properties. ★
  • A system that can coerce property values based on runtime information.

 

이해를 돕기 위해 아래 RadioButton의 Definition을 살펴보자.

RadioButton의 Dependency Property : Group Name

 

RadioButton은 ToggleButton을 상속받아 만들어졌다. 체크되어있거나 언체크되어있거나 한 라디오버튼의 속성을 생각하면 금방 이해가 될것인데, 라디오버튼이 다른 점은 여러개의 라디오 버튼이 GroupName으로 묶여있을 때, 하나만 체크 가능하다는 점이다. 

 

GroupNameProperty의 선언을 보면 new PropertyChangedCallBack(RadioButton.OnGroupNameChanged)가 연결되어 있는 것이 보일것이다.  

 

해당 콜백 함수를 따라가 보면, 현재의 라디오 버튼을 기존에 등록된 GroupName에서 제거하고 새로운 GroupName으로 등록 하는 함수임을 알수 있다. ( 더 따라가 보면,,, RadioButton안에 GroupName을 키로하는 Static한 HashTable이 하나 있고, 여기에 등록하고 등록해제 하는 과정을 볼수 있다. 나는 여기까지..)  

 

이렇게 기존 토글 버튼의 다른 속성은 그대로 사용하면서 GroupName Dependency Property를 이용해 라디오 버튼을 만든것이다.!! 

 

이렇게 이미 정의되어있는 UIElement로 살펴보았지만, 나도 얼마든지 UIElement를 상속받아 Dependency Property를 등록하여 사용할 수 있다. 나는 스타일과 관련한 어떠한 조건을 추가하거나 버튼 등의 이미지를 바인딩 하는 용도로 많이 사용한다.