共用方式為


HOW TO:覆寫相依性屬性的中繼資料

本範例顯示如何藉由呼叫 OverrideMetadata 方法和提供型別專有中繼資料 (Metadata),以覆寫來自繼承類別的預設相依性屬性中繼資料。

範例

藉由定義 PropertyMetadata,類別可定義相依性屬性的行為,例如其預設值和屬性系統回呼 (Callback)。 許多相依性屬性類別在註冊時都已建立了預設中繼資料。 其中包括屬於 WPF API 一部分的相依性屬性。 透過類別繼承來繼承相依性屬性的類別會覆寫原始中繼資料,因此可透過中繼資料變更之屬性的特性將符合任何子類別特定需求。

覆寫相依性屬性上的中繼資料,必須在提供該屬性給屬性系統使用之前完成 (也就是註冊屬性之物件的特定執行個體進行執行個體化之前)。 OverrideMetadata 的呼叫必須在提供本身做為 OverrideMetadata 之 forType 參數的型別的靜態建構函式內執行。 如果您嘗試在擁有者型別的執行個體一旦存在時變更中繼資料,並不會引發例外狀況,但會造成屬性系統中的行為不一致。 此外,每個型別的中繼資料只能覆寫一次。 接下來若要嘗試覆寫相同型別上的中繼資料,就會引發例外狀況。

在下列範例中,自訂類別 MyAdvancedStateControl 會使用新的屬性中繼資料覆寫 MyAdvancedStateControl 提供給 StateProperty 的中繼資料。 例如,當在新建構的 MyAdvancedStateControl 上查詢屬性時,StateProperty 的預設值這時就會是 true。

  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
      Inherits MyStateControl
    Public Sub New()
        MyBase.New()
    End Sub
    Shared Sub New()
      MyStateControl.StateProperty.OverrideMetadata(GetType(MyAdvancedStateControl), New PropertyMetadata(True))
    End Sub
  End Class
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));
  }
}

請參閱

參考

DependencyProperty

概念

相依性屬性概觀

自訂相依性屬性

其他資源

屬性 HOW TO 主題