【问题标题】:The Correct Way to Wrap an Inherited Dependency Property包装继承的依赖属性的正确方法
【发布时间】:2017-04-14 11:49:19
【问题描述】:

我有一个派生自 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;
    }
}

这两种方式似乎都一样,但我不知道是否有任何隐藏的问题。

【问题讨论】:

    标签: wpf inheritance dependency-properties


    【解决方案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;
            }
        }
    }
    

    【讨论】:

    • 好吧,有道理,我的额外逻辑是在同一个元素内,并且只有当基本 DP 发生变化时,这是完美的。
    • 澄清一点:AddOwner 的第二个参数的类型是PropertyMetadataAddOwner 如何知道在没有特定重载的情况下提供了哪些元数据(来自我可以在文档中找到什么...)?
    • 这一切都在Remarks section here(最后一段)中进行了解释。
    • 是的,我已经读过,但它并没有真正的帮助。它说合并行为取决于被合并的类型,这很公平,但没有提到不同类型是如何路由到 DO 中的。我猜FrameworkPropertyMetadata 对象通过它的Merg 方法提供依赖注入,基于它的构造函数重载?
    • 不知道它是如何工作的。但是,PropertyChangedCallbacks “被合并”了,这意味着原始和添加的回调都被调用。
    猜你喜欢
    • 2013-04-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    相关资源
    最近更新 更多