Postupy: Přepsání metadat pro vlastnost závislosti
Tento příklad ukazuje, jak přepsat výchozí metadata vlastnosti závislosti, která pocházejí z zděděné třídy voláním metody OverrideMetadata a poskytnutím metadat specifických pro typ.
Příklad
Definováním PropertyMetadatamůže třída definovat chování vlastnosti závislosti, jako je výchozí hodnota a zpětné volání systému vlastností. Mnoho tříd vlastností závislostí již má výchozí metadata vytvořená v rámci procesu registrace. To zahrnuje vlastnosti závislosti, které jsou součástí rozhraní WPF API. Třída, která dědí vlastnost závislosti prostřednictvím dědičnosti třídy, může přepsat původní metadata tak, aby vlastnosti vlastnosti, které lze změnit prostřednictvím metadat, odpovídaly všem požadavkům specifických pro podtřídu.
Přepsání metadat vlastnosti závislosti musí být provedeno před tím, než tuto vlastnost začne používat systém vlastností (tj. před vytvořením konkrétních instancí objektů, které již registrují tuto vlastnost). Volání OverrideMetadata musí být provedena v rámci statických konstruktorů typu, který sám poskytuje jako forType
parametr OverrideMetadata. Pokud se pokusíte změnit metadata, pokud již existují instance typu vlastníka, nebude vyvolána výjimka, ale způsobí to nekonzistentní chování v systému vlastností. Metadata je také možné přepsat pouze jednou pro každý typ. Při následných pokusech o přepsání metadat stejného typu dojde k výjimce.
V následujícím příkladu vlastní třída MyAdvancedStateControl
přepíše metadata poskytnutá pro StateProperty
MyStateControl
s novými metadaty vlastností. Například výchozí hodnota StateProperty
je nyní true
při dotazování vlastnosti na nově sestavenou instanci MyAdvancedStateControl
.
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
Viz také
- DependencyProperty
- Přehled vlastností závislosti
- vlastní závislostní vlastnosti
- Témata o tom, jak na to
.NET Desktop feedback