共用方式為


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

更新:2007 年 11 月

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

範例

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

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

在下列範例中,自訂類別 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));
  }
}

請參閱

概念

相依性屬性概觀

自訂相依性屬性

參考

DependencyProperty

其他資源

屬性 HOW TO 主題

屬性範例