共用方式為


如何:覆寫相依性屬性的中繼資料

這個範例示範如何藉由呼叫 OverrideMetadata 方法並提供類型特定的中繼資料,覆寫來自繼承類別的預設相依性屬性中繼資料。

範例

藉由定義其 PropertyMetadata ,類別可以定義相依性屬性的行為,例如其預設值和屬性系統回呼。 許多相依性屬性類別都已經有建立為其註冊程序一部分的預設中繼資料。 這包括屬於 WPF API 一部分的相依性屬性。 透過其類別繼承而繼承相依性屬性的類別可以覆寫原始中繼資料;因此,可透過中繼資料變更之屬性的特性會符合所有子類別特定需求。

屬性系統使用所放入的屬性之前,必須覆寫相依性屬性上的中繼資料 (這等同於具現化可註冊屬性之物件的特定執行個體的時間)。 OverrideMetadata呼叫 必須在型別的靜態建構函式內執行,以提供本身做為 forTypeOverrideMetadata 參數。 如果您嘗試在擁有者類型的執行個體存在之後變更中繼資料,則這不會引發例外狀況,但會在屬性系統中導致不一致的行為。 此外,一種類型只能覆寫中繼資料一次。 後續覆寫相同類型上中繼資料的嘗試將會引發例外狀況。

在下列範例中,自訂類別 MyAdvancedStateControl 會將 MyStateControl 針對 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 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

另請參閱