【发布时间】: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