包装继承依赖属性的正确方法

时间:2016-11-30 08:30:24

标签: wpf inheritance dependency-properties

我有一个源自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 个答案:

答案 0 :(得分:1)

您不能在依赖项属性的CLR包装器中调用除GetValueSetValue之外的任何内容。原因在MSDN上的XAML Loading and Dependency Properties文章中进行了解释。

您可以在基类依赖项属性字段上调用AddOwner来注册另一个PropertyChangedCallback,而不是添加新的CLR包装器:

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;
        }
    }
}