2016-11-30 65 views
0

我有一個自定義控件,派生自ToggleButton,我想在基類上包裝一個DP。
我需要做到這一點...正確的方式來包裝一個繼承的依賴屬性

public new bool IsEnabled 
{ 
    get { return (bool)GetValue(IsEnabledProperty); } 
    set 
    { 
     SetValue(IsEnabledProperty, value); 
     if (value && IsChecked == null) 
      IsChecked = false; 
    } 
} 

,或者這是確定...

public new bool IsEnabled 
{ 
    get { return base.IsEnabled; } 
    set 
    { 
     base.IsEnabled = value; 
     if (value && IsChecked == null) 
      IsChecked = false; 
    } 
} 

看來工作相同的兩種方式,但我不知道是否有任何隱藏的問題。

回答

1

在依賴項屬性的CLR包裝中,您不得調用GetValueSetValue以外的其他任何內容。原因在MSDN上的XAML Loading and Dependency Properties文章中有解釋。

,而不是新增CLR包裝的,你可以調用AddOwner基類依賴屬性字段來註冊另一個PropertyChangedCallback

public class MyToggleButton : ToggleButton 
{ 
    static MyToggleButton() 
    { 
     IsEnabledProperty.AddOwner(typeof(MyToggleButton), 
      new FrameworkPropertyMetadata(IsEnabledPropertyChanged)); 
    } 

    private static void IsEnabledPropertyChanged(
     DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     var myToggleButton = (MyToggleButton)o; 

     if ((bool)e.NewValue && !myToggleButton.IsChecked.HasValue) 
     { 
      myToggleButton.IsChecked = false; 
     } 
    } 
} 
+0

OK,是有道理的,我額外的邏輯是一樣的元素中,只有當基本DP改變,所以這是完美的。 –

+0

澄清一點:AddOwner的第二個參數的類型是PropertyMetadata,當沒有特定的重載要告訴它時,AddOwner如何知道提供了哪些元數據(從我能在文檔中找到的內容) ...)? –

+0

這些都在[備註部分](https://msdn.microsoft.com/en-us/library/ms597484(v=vs.110).aspx)(最後一段)中解釋。 – Clemens