正确的方式来包装一个继承的依赖属性

问题描述:

我有一个自定义控件,派生自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; 
    } 
} 

看来工作相同的两种方式,但我不知道是否有任何隐藏的问题。

在依赖项属性的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