Postupy: Přetížení metadat pro vlastnost závislosti
Tento příklad ukazuje, jak přepsat výchozí metadata vlastností závislostí pocházející z zděděné třídy voláním OverrideMetadata metody a poskytnutím metadat specifických pro typ.
Příklad
Definováním třídy PropertyMetadatamůže 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ž se tato vlastnost použije systémem vlastností (to se rovná době, kdy se vytvoří instance konkrétních instancí objektů, které registrují vlastnost). Volání musí OverrideMetadata být provedena v rámci statických konstruktorů typu, který poskytuje sám jako forType
parametr .OverrideMetadata Pokud se pokusíte změnit metadata, jakmile instance typu vlastníka existují, nevyvolá se výjimky, ale způsobí 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á StateProperty
MyStateControl
novými metadaty vlastností. Například výchozí hodnota objektu StateProperty
je nyní true
, když je vlastnost dotazována na nově sestavenou MyAdvancedStateControl
instanci.
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é
.NET Desktop feedback
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro