如何:重写依赖项属性的元数据
更新:2007 年 11 月
此示例演示如何重写来自继承类的默认依赖项属性元数据,其方法是调用 OverrideMetadata 方法并提供特定于类型的元数据。
示例
通过定义其 PropertyMetadata,类可以定义依赖项属性的行为,例如,其默认值和属性系统回调。很多依赖项属性类都已经将默认元数据作为其注册过程的一部分而创建。这包含作为 WPF API 一部分的依赖项属性。通过其类继承继承依赖项属性的类可以重写原始的元数据,以便可以通过元数据更改的属性的特征将与任何特定于子类的要求匹配。
在依赖项属性上重写元数据的操作必须在将该属性提供给属性系统使用之前进行,也就是说,在对注册属性的对象的特定实例进行实例化之前进行。必须在将其自身提供为 OverrideMetadata 的 forType 参数的类型的静态构造内执行对 OverrideMetadata 的调用。如果在所有者类型的实例存在之后试图更改元数据,这将不会引发异常,但会在属性系统中导致不一致的行为。此外,每种类型只可以重写一次元数据。以后在同一类型上重写元数据的尝试将会引发异常。
在下面示例中,自定义类 MyAdvancedStateControl 重写由带有新属性元数据的 MyAdvancedStateControl 为 StateProperty 提供的元数据。例如,当在新构造的 MyAdvancedStateControl 实例上查询 StateProperty 时,其默认值现在是 true。
public class MyStateControl : ButtonBase
{
public MyStateControl() : base() { }
public Boolean State
{
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
}
public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
"State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
}
...
public class MyAdvancedStateControl : MyStateControl
{
public MyAdvancedStateControl() : base() { }
static MyAdvancedStateControl()
{
MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
}
}