如何:重写依赖属性的元数据

此示例演示如何重写来自继承类的默认依赖属性元数据,其方法是调用 OverrideMetadata 方法并提供特定于类型的元数据。

示例

通过定义其 PropertyMetadata,类可以定义依赖属性的行为,例如其默认值和属性系统回叫。 很多依赖属性类都已经将默认元数据创建为其注册过程的一部分。 这包含作为 WPF API 一部分的依赖属性。 通过其类继承继承依赖属性的类可重写原始的元数据,以便可通过元数据更改的属性的特征与任何特定于子类的要求相匹配。

在依赖属性上重写元数据的操作必须在属性系统使用该属性之前进行,也就是说,在对注册属性的对象的特定实例进行实例化之前进行。 必须在将其自身作为 OverrideMetadataforType 参数的类型的静态构造函数内执行对 OverrideMetadata 的调用。 所有者类型的实例存在之后尝试更改元数据不会引发异常,但会在属性系统中导致不一致的行为。 此外,每种类型只可以重写一次元数据。 以后在同一类型上重写元数据的尝试会引发异常。

在下面示例中,自定义类 MyAdvancedStateControl 重写了由带有新属性元数据的 MyStateControlStateProperty 提供的元数据。 例如,在新构造的 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 MyStateControl
    Inherits ButtonBase
  Public Sub New()
      MyBase.New()
  End Sub
  Public Property State() As Boolean
    Get
        Return CType(Me.GetValue(StateProperty), Boolean)
    End Get
    Set(ByVal value As Boolean)
        Me.SetValue(StateProperty, value)
    End Set
  End Property
  Public Shared ReadOnly StateProperty As DependencyProperty = DependencyProperty.Register("State", GetType(Boolean), GetType(MyStateControl),New PropertyMetadata(False))
End Class
public class MyAdvancedStateControl : MyStateControl
{
  public MyAdvancedStateControl() : base() { }
  static MyAdvancedStateControl()
  {
    MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
  }
}
Public Class MyAdvancedStateControl
    Inherits MyStateControl
  Public Sub New()
      MyBase.New()
  End Sub
  Shared Sub New()
    MyStateControl.StateProperty.OverrideMetadata(GetType(MyAdvancedStateControl), New PropertyMetadata(True))
  End Sub
End Class

另请参阅