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

The Correct Way to Wrap an Inherited Dependency Property

我有一个派生自 ToggleButton 的自定义控件,我想在基础 class 上包装一个 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 文章解释了原因。

您可以在基础 class 依赖项 属性 字段上调用 ​​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;
        }
    }
}