如何更改继承的依赖项属性的默认值?

时间:2011-04-13 17:47:43

标签: wpf subclass dependency-properties default-value

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

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

这就是我目前正在做的事情(这是一个带有'Foo'DP的测试控件的例子。)我不是隐藏属性的'新'的粉丝,尽管感谢{ {1}},它确实指向同一个共享实例,所以我猜它没问题。它看起来像是继承了所有其他元数据值,所以这很好。只是想知道这是否正确?

AddOwner

标记

UPDATE ...

我认为这更好,因为它消除了'新'电话。您仍然可以通过基类上的FooProperty访问它,因为它使用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 ); } 。因此,它在技术上是相同的。

AddOwner

1 个答案:

答案 0 :(得分:40)

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

static TestControl() {

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

编辑:

AddOwner旨在在不相关的类型之间共享相同的DependencyProperty(即TextPropertyTextBox的{​​{1}}。