2017-04-21 3 views
1

상속, 어떻게 상속 DependencyProperty에 IsEnabledProperty에 대한 PropertyChangedCallback를 추가하려면? WPF - 사용자 지정 컨트롤 - 다음과 같은 <strong>사용자 지정 컨트롤</strong>의 경우 DependencyProperty에와 PropertyChangedCallback


public class MyCustomControl : ContentControl 
{ 
     // Custom Dependency Properties 

     static MyCustomControl() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl))); 
      // TODO (?) IsEnabledProperty.OverrideMetadata(typeof(MyCustomControl), new PropertyMetadata(true, CustomEnabledHandler)); 
     } 

     public CustomEnabledHandler(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      // Implementation 
     } 
} 

는 같은 다른 옵션은 IsEnabledChangeEvent

public class MyCustomControl : ContentControl 
{ 
     public MyCustomControl() 
     { 
      IsEnabledChanged += … 
     } 
} 

을들을하지만 모든 인스턴스에 접근 등록 이벤트 핸들러를 좋아하지 않아있다. 그래서 나는 메타 데이터를 우선하는 것을 선호한다.

+0

OverrideMetadata의 문제점은 무엇입니까? 그러나 PropertyMetadata 대신 FrameworkPropertyMetadata 여야합니다. – Clemens

+0

@Clemens ** XAML **에서이 컨트롤을 사용하면 오류가 발생합니다. _Metadata 재정의 및 기본 메타 데이터는 동일한 유형 또는 파생 된 형식이어야합니다. _ FrameworkPropertyMetadata에서도 시도합니다. – David

+0

FrameworkPropertyMetadata와 함께 작동합니다. 다시 시도하십시오. – Clemens

답변

2

이 작동 :

public class MyCustomControl : ContentControl 
{ 
    static MyCustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl))); 
    } 

    public MyCustomControl() 
    { 
     IsEnabledChanged += (s, e) => { /* do something */ }; 
    } 
} 

또 다른 옵션은 기존 종속성 속성의 변경에 대응 조치를 peform받는 할 DependencyPropertyDescriptor를 사용하는 것입니다 : 당신은 사용자 정의 클래스의 생성자에서 할 수있는

static MyCustomControl() 
{ 
    DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), 
     new FrameworkPropertyMetadata(typeof(MyCustomControl))); 

    IsEnabledProperty.OverrideMetadata(typeof(MyCustomControl), 
     new FrameworkPropertyMetadata(IsEnabledPropertyChanged)); 
} 

private static void IsEnabledPropertyChanged(
    DependencyObject obj, DependencyPropertyChangedEventArgs e) 
{ 
    Debug.WriteLine("{0}.IsEnabled = {1}", obj, e.NewValue); 
} 
+0

예, 이것이 내가 찾고 있었던 것입니다. 감사합니다. 한가지 더 질문 해주세요. 'IsEnabledProperty'의 원래 동작은 여전히 ​​작동합니까? 이것은 다른 콜백 하나만 추가합니다. 맞습니까? – David

+0

정확히, 온라인 문서에서도 잘 설명되어 있습니다 ... – Clemens

1

But I don't like the approach register event handler in every instance.

모든 경우에이 작업을 수행 할 필요는 없습니다. https://blog.magnusmontin.net/2014/03/31/handling-changes-to-dependency-properties/

+0

예,이 방법을 생각했습니다. 나는 또한'DependencyPropertyDescriptor'를 본다. - 그러나 여전히 - 나는 'MyCustomControl'의 모든 인스턴스가 변경 이벤트에 대한 참조를 추가한다고 생각한다. – David

+0

물론. 어떻게하면 모든 인스턴스가 변경을 처리 할 수 ​​있습니까? 그리고 OverrideMetdata가 CustomEnabledHandler로 무엇을한다고 생각합니까? – mm8

+0

'OverrideMetadata'는 인스턴스간에 콜백 메소드의 정보를 "공유"한다고 생각하지 않습니까? 따라서 콜백 메소드는'DependencyObject' -'CustomEnabledHandler (DependencyObject d, DependencyPropertyChangedEventArgs e)'를 알아야합니다. – David

관련 문제