【问题标题】:How can I change the default value of an inherited dependency property?如何更改继承的依赖属性的默认值?
【发布时间】:2011-08-04 22:22:44
【问题描述】:

如何更改继承的依赖属性的默认值?在我们的例子中,我们创建了一个 Control 的子类,默认情况下它的Focusable 设置为“true”。我们希望我们的子类具有默认值“false”。

我们一直在做的只是在构造函数中将其设置为“false”,但如果有人使用 ClearValue,它会返回默认值,而不是构造函数中设置的值。

这是我目前为实现这一目标所做的工作(例如,这是一个 DP 为“Foo”的测试控件。)我不喜欢隐藏属性的“新”,尽管感谢 @ 987654322@,它确实指向同一个共享实例,所以我想没关系。看起来它也继承了所有其他元数据值,所以这很好。只是想知道这是否正确?

public class TestControlBase : Control
{

    public static readonly DependencyProperty FooProperty = DependencyProperty.Register(
        "Foo",
        typeof(int),
        typeof(TestControlBase),
        new FrameworkPropertyMetadata(4) // Original default value
    );

    public int Foo
    {
        get { return (int)GetValue(FooProperty); }
        set { SetValue(FooProperty, value); }
    }

}

public class TestControl : TestControlBase
{

    public static readonly new DependencyProperty FooProperty = TestControlBase.FooProperty.AddOwner(
        typeof(TestControl),
        new FrameworkPropertyMetadata(67) // New default for this subclass
    );

}

标记

更新...

我认为这更好,因为它消除了“新”调用。您仍然可以通过基类上的 FooProperty 访问它,因为它使用 AddOwner。因此,它在技术上是相同的。

public class TestControl : TestControlBase
{
    // Note this is private
    private static readonly DependencyProperty AltFooProperty = TestControlBase.FooProperty.AddOwner(
        typeof(TestControl),
        new FrameworkPropertyMetadata(67) // New default for this subclass
    );

}

【问题讨论】:

  • DependencyProperty 类型的静态字段应始终公开,否则将无法正常工作。
  • 实际上,正如我所说,因为我实际上只是在做一个 AddOwner,所以您永远不需要访问私有的,因为它是您使用的基类中的共享的。不过,下面的答案是正确的方法...... OverrideMetadata。就是这张票!

标签: wpf subclass dependency-properties default-value


【解决方案1】:

覆盖基类属性的正确方法是:

static TestControl() {

    FooProperty.OverrideMetadata(
        typeof(TestControl),
        new FrameworkPropertyMetadata(67)
    );
}

编辑:

AddOwner 旨在在不相关的类型之间共享相同的DependencyProperty(即TextBoxTextBlockTextProperty)。

【讨论】:

  • 想知道...您是否还必须明确指定 FrameworkPropertyMetadata 上的所有其他属性,或者仅指定更改的内容?在这种情况下,它并不多,但是如果 AffectsMeasure 或 AffectsRender 标志可能是非默认的,我是否也必须指定它们,或者如果我没有明确设置它们,它们是否会继承它们的值? (如果你知道答案,很好,但我也会为此编写一些测试代码。)
  • @MarqueIV - 查看反射器中的代码,您无需再次设置它们。几个设置是 ORed 在一起的(即,如果基本设置 AffectsRender 或者您设置 AffectsRender,那么它会影响渲染),其他设置可以被覆盖(例如 Inherits)。
  • 我在获得新的 MBP 时丢失了 Reflector 副本。是时候再找它了!所以我想如果它仍然可以访问原始元数据(“或”反对),那么它本身并不是真正的“压倒一切”。很高兴知道!值得一提的是,你亲自回答了我的很多问题或对我的很多问题做出了贡献。感谢您成为本网站的重要资产!真的很感激。
  • 请注意,您需要设置null,然后使用类型转换执行new FrameworkPropertyMetadata((object)null)。否则调用构造函数FrameworkPropertyMetadata(PropertyChangedCallback)
猜你喜欢
  • 2018-06-07
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2013-04-01
  • 1970-01-01
  • 2011-12-01
相关资源
最近更新 更多