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));
}
}