[WPF] 의존 프로퍼티(Dependency Property) 이해하기

title-gonggo.png

[WPF] 의존 프로퍼티(Dependency Property) 이해하기

주성돈기자

의존 프로퍼티란?

프로퍼티 값이 변경되었을 때 자동으로 어떤 일을 처리하게 할 수 있게 해주는 것.
스타일링, 데이터 바인딩, 애니메이션 등 WPF 주요 부분에 사용된다.

의존 프로퍼티 사용 이유 (장점)

의존 프로퍼티를 사용하면 엘리먼트를 사용하는 시점에 프로퍼티 값이 결정되고, Static 변수이기 때문에 메모리 절약에 효과적이다.
프로퍼티를 구현할 때 필요한 많은 코드를 표준화할 수 있다.

일반 프로퍼티와 다른 점

의존 프로퍼티에는 값이 변경되었을 때 자동으로 알림을 주는 "변경 통보" 기능이 있다.
일반적인 플랫폼은 데이터 값이 변경되었을 때 UI도 변경되는 기능이 많은데, 이럴 때 의존 프로퍼티를 사용해서 편리하게 구현할 수 있다.

구현 예시

1. 의존 프로퍼티를 등록한다.

의존 프로퍼티 등록 함수(DependencyProperty.Register)의 파라미터로 프로퍼티 이름, 프로퍼티 타입, 의존 프로퍼티를 사용하는 클래스 타입이 꼭 필요하다.
개인적으로 만든 오버로드 메소드를 사용하고 싶다면, Metadata를 추가해주면 된다.
Metadata에는 프로퍼티 기본 값과 콜백 메서드를 설정할 수 있다.

      publicstaticreadonly DependencyProperty IsDefaultProperty = DependencyProperty.Register("IsDefault", typeof(bool), typeof(Button), 
                         new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnIsDefaultChanged)));
      

예제 해석
사용할 프로퍼티 : IsDefault
프로퍼티 타입 : bool
의존 프로퍼티 사용 클래스 : Button 클래스
의존 프로퍼티 기본 값 : false
콜백 메소드명 : OnIsDefaultChanged

2. 의존 프로퍼티로 사용할 값을 구현한다.

      publicbool IsDefault
{
    get { return (bool)GetValue(Button.IsDefaultProperty); }
    set { SetValue(Button.IsDefaultProperty, value); }
}
      

GetValue와 SetValue로 의존 프로퍼티에 접근할 수 있는 IsDefault를 구현했다.

3. 프로퍼티 값이 변경될 때 호출되는 콜백 메서드를 만든다.

의존 프로퍼티를 갖고 있는 모든 클래스는 DependencyObject를 상속받아야 한다.

      privatestaticvoid OnIsDefaultChanged{
    DependencyObject o, DependencyPropertyChangedEventArgs e){
        //code
    }
}
      

전체 코드

      publicclassButton : ButtonBase
{
    publicstaticreadonly DependencyProperty IsDefaultProperty = DependencyProperty.Register("IsDefault", typeof(bool), typeof(Button),
                    new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnIsDefaultChanged)));
    publicbool IsDefault
    {
        get { return (bool)GetValue(Button.IsDefaultProperty); }
        set { SetValue(Button.IsDefaultProperty, value); }
    }
    privatestaticvoid OnIsDefaultChanged
    {
        DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            //code
        }
    }
}
      
0 Comments

최근글


새댓글


Facebook Twitter GooglePlus KakaoStory KakaoTalk NaverBand