Gewusst wie: Überschreiben von Metadaten für eine Abhängigkeitseigenschaft
Aktualisiert: November 2007
In diesem Beispiel wird veranschaulicht, wie die standardmäßigen Metadaten für die Abhängigkeitseigenschaft einer geerbten Klasse überschrieben werden, indem die OverrideMetadata-Methode aufgerufen wird und typspezifische Metadaten bereitgestellt werden.
Beispiel
Durch die Definition der PropertyMetadata kann eine Klasse die Verhalten einer Abhängigkeitseigenschaft definieren, wie z. B. deren Standardwert und Rückrufe des Eigenschaftensystems. Viele Abhängigkeitseigenschaftenklassen verfügen bereits über Standardmetadaten als Teil ihres Registrierungsprozesses. Hierzu gehören die Abhängigkeitseigenschaften, die Teil von WPF API sind. Eine Klasse, die die Abhängigkeitseigenschaft über ihre Klassenvererbung erbt, kann die ursprünglichen Metadaten überschreiben, sodass die Eigenschaftenmerkmale, die über Metadaten geändert werden können, eventuellen unterklassenspezifischen Anforderungen entsprechen.
Das Überschreiben von Metadaten für eine Abhängigkeitseigenschaft muss durchgeführt werden, bevor die betreffende Eigenschaft für die Verwendung im Eigenschaftensystem verfügbar gemacht wird (dies entspricht dem Zeitpunkt, zu dem bestimmte Instanzen von Objekten instanziiert werden, die die Eigenschaft registrieren). Aufrufe von OverrideMetadata müssen in den statischen Konstruktoren des Typs ausgeführt werden, der sich selbst als forType-Parameter von OverrideMetadata bereitstellt. Durch den Versuch, Metadaten zu ändern, nachdem Instanzen des Besitzertyps vorhanden sind, werden keine Ausnahmen ausgelöst. Dies führt jedoch zu inkonsistentem Verhalten im Eigenschaftensystem. Außerdem können Metadaten nur einmal pro Typ überschrieben werden. Nachfolgende Versuche, Metadaten für den gleichen Typ zu überschreiben, lösen eine Ausnahme aus.
Im folgenden Beispiel überschreibt die benutzerdefinierte MyAdvancedStateControl-Klasse die für die StateProperty von MyAdvancedStateControl bereitgestellten Metadaten mit neuen Eigenschaftenmetadaten. Der Standardwert der StateProperty ist z. B. jetzt true, wenn die Eigenschaft für eine neu erstellte MyAdvancedStateControl-Instanz abgefragt wird.
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));
}
}
Siehe auch
Konzepte
Übersicht über Abhängigkeitseigenschaften
Benutzerdefinierte Abhängigkeitseigenschaften