Jak zastąpić metadane dla właściwości zależności
W tym przykładzie pokazano, jak zastąpić domyślne metadane właściwości zależności pochodzące z dziedziczonej klasy przez wywołanie OverrideMetadata metody i podanie metadanych specyficznych dla typu.
Przykład
Definiując klasę PropertyMetadata, klasa może definiować zachowania właściwości zależności, takie jak jego wartość domyślna i wywołania zwrotne systemu właściwości. Wiele klas właściwości zależności ma już domyślne metadane ustanowione w ramach procesu rejestracji. Obejmuje to właściwości zależności, które są częścią interfejsu API WPF. Klasa, która dziedziczy właściwość zależności za pośrednictwem dziedziczenia klasy, może zastąpić oryginalne metadane, tak aby właściwości właściwości, które można zmienić za pomocą metadanych, będą zgodne z dowolnymi wymaganiami specyficznymi dla podklasy.
Zastępowanie metadanych właściwości zależności należy wykonać przed umieszczeniem tej właściwości w użyciu przez system właściwości (odpowiada to czasowi utworzenia wystąpienia określonych wystąpień obiektów rejestrujących właściwość). Wywołania do OverrideMetadata muszą być wykonywane w konstruktorach statycznych typu, który udostępnia się jako forType
parametr .OverrideMetadata Jeśli spróbujesz zmienić metadane po wystąpieniu typu właściciela, nie będzie to zgłaszać wyjątków, ale spowoduje to niespójne zachowania w systemie właściwości. Ponadto metadane można przesłonić tylko raz na typ. Kolejne próby zastąpienia metadanych w tym samym typie spowodują wystąpienie wyjątku.
W poniższym przykładzie klasa MyAdvancedStateControl
niestandardowa zastępuje metadane udostępniane StateProperty
przez element za pomocą MyStateControl
nowych metadanych właściwości. Na przykład wartość domyślna elementu StateProperty
to teraz true
, gdy właściwość jest odpytywane w nowo skonstruowanym MyAdvancedStateControl
wystąpieniu.
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
Zobacz też
.NET Desktop feedback