Freigeben über


Metadaten der Abhängigkeitseigenschaft

Das Windows Presentation Foundation (WPF)-Eigenschaftensystem enthält ein Metadatenberichtssystem für Abhängigkeitseigenschaften. Die Informationen, die über das Metadatenberichterstattungssystem verfügbar sind, gehen über das hinaus, was durch Reflexion oder Common Language Runtime (CLR)-Merkmale verfügbar ist. Wenn Sie eine Abhängigkeitseigenschaft registrieren, haben Sie die Möglichkeit, Metadaten zu erstellen und ihm zuzuweisen. Wenn Sie von einer Klasse abgeleitet werden, die eine Abhängigkeitseigenschaft definiert, können Sie die Metadaten für die geerbte Abhängigkeitseigenschaft überschreiben. Und wenn Sie Ihre Klasse als Besitzer einer Abhängigkeitseigenschaft hinzufügen, können Sie die Metadaten der geerbten Abhängigkeitseigenschaft überschreiben.

Voraussetzungen

In diesem Artikel wird davon ausgegangen, dass Sie über grundlegende Kenntnisse von Abhängigkeitseigenschaften verfügen und eine Übersicht über Abhängigkeitseigenschaften gelesen haben. Um den Beispielen in diesem Artikel zu folgen, hilft es Ihnen, wenn Sie mit Extensible Application Markup Language (XAML) vertraut sind und wissen, wie WPF-Anwendungen geschrieben werden.

Verwendung von Metadaten

Sie können Abhängigkeitseigenschaftsmetadaten abfragen, um die Merkmale einer Abhängigkeitseigenschaft zu untersuchen. Wenn das Eigenschaftensystem eine Abhängigkeitseigenschaft verarbeitet, greift es auf seine Metadaten zu. Das Metadatenobjekt für eine Abhängigkeitseigenschaft enthält die folgenden Informationstypen:

  • Der Standardwert der Abhängigkeitseigenschaft, die vom Eigenschaftensystem festgelegt wird, wenn kein anderer Wert angewendet wird, z. B. ein lokaler Wert, eine Formatvorlage oder ein Vererbungswert. Weitere Informationen zur Wertrangfolge während der Laufzeitzuweisung von Abhängigkeitseigenschaftswerten finden Sie unter Rangfolge der Abhängigkeitseigenschaft.

  • Verweise auf Zwangswertrückrufe und Eigenschaftsänderungsrückrufe für den Eigentümertyp. Sie können nur Verweise auf Rückrufe abrufen, die über einen public Zugriffsmodifizierer verfügen oder sich innerhalb Ihres zulässigen Zugriffsbereichs befinden. Weitere Informationen zu Rückrufen von Abhängigkeitseigenschaften finden Sie unter Dependency property callbacks and validation.

  • Merkmale der WPF-Framework-Eigenschaften (wenn die Abhängigkeitseigenschaft eine DependencyProperty des WPF-Frameworks ist). WPF-Prozesse, wie die Framework-Layout-Engine und die Logik der Eigenschaftsvererbung, greifen auf Metadaten der WPF-Framework-Ebene zu. Weitere Informationen finden Sie unter Framework-Eigenschaftsmetadaten.

Metadaten-APIs

Die PropertyMetadata Klasse speichert die meisten metadaten, die vom Eigenschaftensystem verwendet werden. Metadateninstanzen können erstellt und zugewiesen werden:

  • Typen, die Abhängigkeitseigenschaften beim Eigenschaftensystem registrieren.

  • Typen, die von einer Klasse erben, die eine Abhängigkeitseigenschaft definiert.

  • Typen, die sich selbst als Besitzer einer Abhängigkeitseigenschaft hinzufügen.

Wenn ein Typ eine Abhängigkeitseigenschaft ohne Angabe von Metadaten registriert, weist das Eigenschaftensystem ein PropertyMetadata Objekt mit Standardwerten für diesen Typ der Abhängigkeitseigenschaft zu.

Um Metadaten für eine Abhängigkeitseigenschaft abzurufen, rufen Sie eine der GetMetadata Überladungen des DependencyProperty Bezeichners auf. Die Metadaten werden als PropertyMetadata Objekt zurückgegeben.

Spezifischere Metadatenklassen, abgeleitet von PropertyMetadata, sind für verschiedene Architekturbereiche vorhanden. Unterstützt z. B UIPropertyMetadata . die Animationsberichterstattung und FrameworkPropertyMetadata die WPF-Frameworkeigenschaften. Abhängigkeitseigenschaften können auch bei den PropertyMetadata abgeleiteten Klassen registriert werden. Obwohl GetMetadata ein PropertyMetadata Objekt zurückgegeben wird, können Sie ggf. in einen abgeleiteten Typ umwandeln, um typspezifische Eigenschaften zu untersuchen.

Die Eigenschaften, die von FrameworkPropertyMetadata offengelegt werden, werden manchmal als Flags bezeichnet. Wenn Sie eine FrameworkPropertyMetadata Instanz erstellen, haben Sie die Möglichkeit, eine Instanz des Enumerationstyps FrameworkPropertyMetadataOptions an den FrameworkPropertyMetadata Konstruktor zu übergeben. Mit FrameworkPropertyMetadataOptions können Sie Metadatenkennzeichnungen durch eine bitweise Kombination festlegen. Die FrameworkPropertyMetadata nutzt FrameworkPropertyMetadataOptions, um die Länge der Konstruktorsignatur in einem vernünftigen Rahmen zu halten. Bei der Registrierung von Abhängigkeitseigenschaften werden die Metadatenkennzeichen, die Sie auf FrameworkPropertyMetadataOptions festlegen, innerhalb von FrameworkPropertyMetadata als Boolean-Eigenschaften anstelle einer bitweisen Kombination von Flags freigegeben, um das Abfragen von Metadatenmerkmalen intuitiver zu gestalten.

Neue Metadaten überschreiben oder erstellen?

Wenn Sie eine Abhängigkeitseigenschaft erben, haben Sie die Möglichkeit, die Merkmale der Abhängigkeitseigenschaft zu ändern, indem Sie dessen Metadaten überschreiben. Möglicherweise sind Sie jedoch nicht immer in der Lage, Ihr Abhängigkeitseigenschaftsszenario durch Überschreiben von Metadaten zu erreichen, und manchmal ist es erforderlich, eine benutzerdefinierte Abhängigkeitseigenschaft in Ihrer Klasse mit neuen Metadaten zu definieren. Benutzerdefinierte Abhängigkeitseigenschaften verfügen über die gleichen Funktionen wie Abhängigkeitseigenschaften, die von WPF-Typen definiert werden. Weitere Informationen finden Sie unter Benutzerdefinierte Abhängigkeitseigenschaften.

Ein Merkmal einer Abhängigkeitseigenschaft, die Sie nicht außer Kraft setzen können, ist der Werttyp. Wenn eine geerbte Abhängigkeitseigenschaft das ungefähre Verhalten aufweist, das Sie benötigen, für Ihr Szenario jedoch einen anderen Werttyp erforderlich ist, sollten Sie eine benutzerdefinierte Abhängigkeitseigenschaft implementieren. Möglicherweise können Sie die Eigenschaftswerte über die Typkonvertierung oder eine andere Implementierung in Ihrer abgeleiteten Klasse verknüpfen.

Szenarien für das Überschreiben von Metadaten

Beispielszenarien für das Überschreiben vorhandener Abhängigkeitseigenschaftsmetadaten sind:

  • Ändern des Standardwerts, bei dem es sich um ein gängiges Szenario handelt.

  • Ändern oder Hinzufügen von Rückrufen für Eigenschaftsänderungen, die möglicherweise erforderlich sind, wenn eine geerbte Abhängigkeitseigenschaft mit anderen Abhängigkeitseigenschaften anders interagiert als die Basisimplementierung. Eines der Merkmale eines Programmiermodells, das Sowohl Code als auch Markup unterstützt, besteht darin, dass Eigenschaftswerte in beliebiger Reihenfolge festgelegt werden können. Dieser Faktor kann sich darauf auswirken, wie Sie Rückrufe für Eigenschaftsänderungen implementieren. Weitere Informationen finden Sie unter Rückrufe und Validierung von Abhängigkeitseigenschaften.

  • Ändern der Metadatenoptionen der WPF-Framework-Eigenschaft . Metadatenoptionen werden in der Regel während der Registrierung einer neuen Abhängigkeitseigenschaft festgelegt, sie können jedoch in OverrideMetadata oder AddOwner aufrufen erneut angegeben werden. Weitere Informationen zum Überschreiben von Framework-Eigenschaftsmetadaten finden Sie unter Angeben von FrameworkPropertyMetadata. Informationen zum Festlegen von Metadatenoptionen für Frameworkeigenschaften beim Registrieren einer Abhängigkeitseigenschaft finden Sie unter Benutzerdefinierte Abhängigkeitseigenschaften.

Hinweis

Da Validierungsrückrufe nicht Teil von Metadaten sind, können sie nicht durch Überschreiben von Metadaten geändert werden. Weitere Informationen finden Sie unter Überprüfungswertrückrufe.

Überschreiben von Metadaten

Bei der Implementierung einer neuen Abhängigkeitseigenschaft können Sie die Metadaten mithilfe von Überladungen der Register Methode festlegen. Wenn Ihre Klasse eine Abhängigkeitseigenschaft erbt, können Sie geerbte Metadatenwerte mithilfe der OverrideMetadata Methode außer Kraft setzen. Sie können beispielsweise OverrideMetadata verwenden, um typspezifische Werte festzulegen. Weitere Informationen und Codebeispiele finden Sie unter Überschreiben von Metadaten für eine Abhängigkeitseigenschaft.

Ein Beispiel für eine WPF-Abhängigkeitseigenschaft ist Focusable. Die FrameworkElement Klasse registriert Focusable. Die Control-Klasse leitet sich von FrameworkElement ab, erbt die Focusable-Abhängigkeitseigenschaft und überschreibt die Eigenschaftsmetadaten des geerbten Elements. Die Überschreibung ändert den Standardeigenschaftswert von false zu true, behält jedoch andere geerbte Metadatenwerte bei.

Da die meisten vorhandenen Abhängigkeitseigenschaften keine virtuellen Eigenschaften sind, überschreibt ihre geerbte Implementierung das vorhandene Element. Wenn Sie ein Metadatenmerkmal außer Kraft setzen, ersetzt der neue Metadatenwert entweder den ursprünglichen Wert oder wird zusammengeführt:

  • Bei einem DefaultValueWert ersetzt der neue Wert den vorhandenen Standardwert. Wenn Sie in den Überschreibungsmetadaten kein DefaultValue angeben, stammt der Wert vom nächstgelegenen Vorgänger, der DefaultValue in den Metadaten angegeben hat.

  • Bei einer PropertyChangedCallback-Zusammenführung speichert die Standardzusammenführungslogik alle PropertyChangedCallback-Werte in einer Tabelle, und sie werden alle bei einer Eigenschaftsänderung aufgerufen. Die Rückrufreihenfolge wird durch die Klassentiefe bestimmt, bei der ein von der Basisklasse in der Hierarchie registrierter Rückruf zuerst ausgeführt wird.

  • Bei einem CoerceValueCallback, der neue Wert ersetzt den vorhandenen CoerceValueCallback Wert. Wenn Sie in den Überschreibungsmetadaten kein CoerceValueCallback angeben, stammt der Wert vom nächstgelegenen Vorgänger, der CoerceValueCallback in den Metadaten angegeben hat.

Hinweis

Die Standard-Zusammenführungslogik wird von der Merge-Methode implementiert. Sie können benutzerdefinierte Zusammenführungslogik in einer abgeleiteten Klasse angeben, die eine Abhängigkeitseigenschaft erbt, indem Sie Merge in dieser Klasse überschreiben.

Fügen Sie eine Klasse als Besitzer hinzu

Verwenden Sie die AddOwner Methode, um eine Abhängigkeitseigenschaft zu erben, die in einer anderen Klassenhierarchie registriert ist. Diese Methode wird in der Regel verwendet, wenn die hinzufügende Klasse nicht vom Typ abgeleitet wird, der die Abhängigkeitseigenschaft registriert hat. AddOwner Im Aufruf kann die hinzufügende Klasse typspezifische Metadaten für die geerbte Abhängigkeitseigenschaft erstellen und zuweisen. Um vollständig am Eigenschaftensystem teilzunehmen, sollte die hinzufügende Klasse durch Code und Markup die folgenden öffentlichen Member implementieren.

  • Ein Abhängigkeitseigenschaftsbezeichnerfeld. Der Wert des Bezeichners der Abhängigkeitseigenschaft ist der Rückgabewert des AddOwner Aufrufs. Dieses Feld sollte ein public static readonly Feld vom Typ DependencyPropertysein.

  • Ein CLR-Wrapper, der get- und set-Accessoren implementiert. Mithilfe eines Eigenschaftenwrappers können Nutzer von Abhängigkeitseigenschaften diese abrufen oder festlegen, genau wie jede andere CLR-Eigenschaft. Die get- und set-Accessoren kommunizieren über DependencyObject.GetValue- und DependencyObject.SetValue-Aufrufe mit dem zugrunde liegenden Eigenschaftensystem, indem sie den Bezeichner der Abhängigkeitseigenschaft als Parameter übergeben. Implementieren Sie den Wrapper auf die gleiche Weise wie beim Registrieren einer benutzerdefinierten Abhängigkeitseigenschaft. Weitere Informationen finden Sie unter Benutzerdefinierte Abhängigkeitseigenschaften

Eine Klasse, die AddOwner aufruft, hat dieselben Anforderungen für die Bereitstellung des Objektmodells der geerbten Abhängigkeitseigenschaft wie eine Klasse, die eine neue benutzerdefinierte Abhängigkeitseigenschaft definiert. Weitere Informationen finden Sie unter Hinzufügen eines Besitzertyps für eine Abhängigkeitseigenschaft

Metadaten der angefügten Eigenschaft

In WPF werden die meisten benutzeroberflächebezogenen angefügten Eigenschaften für WPF-Typen als Abhängigkeitseigenschaften implementiert. Angefügte Eigenschaften, die als Abhängigkeitseigenschaften implementiert werden, unterstützen Abhängigkeitseigenschaftenkonzepte, z. B. Metadaten, die abgeleitete Klassen überschreiben können. Metadaten für eine angefügte Eigenschaft unterscheiden sich in der Regel nicht von einer Abhängigkeitseigenschaft. Sie können die Standardwerte, Eigenschaftsänderungsrückrufe und WPF-Frameworkeigenschaften für die geerbte angefügte Eigenschaft in Instanzen der überschreibenden Klasse überschreiben. Weitere Informationen finden Sie unter Metadaten für angefügte Eigenschaften

Hinweis

Verwenden Sie immer RegisterAttached, um Eigenschaften zu registrieren, bei denen Sie Inherits in den Metadaten angeben. Obwohl die Eigenschaftswertvererbung möglicherweise für nicht angefügte Eigenschaften funktioniert, ist das Wertvererbungsverhalten für eine nicht angefügte Eigenschaft über bestimmte Objekt-Aufteilungen im Ausführungsbaum nicht definiert. Die Inherits Eigenschaft ist für nicht verbundene Eigenschaften nicht relevant. Weitere Informationen finden Sie unter RegisterAttached(String, Type, Type, PropertyMetadata) sowie im Abschnitt „Hinweise“ von Inherits.

Hinzufügen einer Klasse als Besitzer einer angefügten Eigenschaft

Um eine angefügte Eigenschaft von einer anderen Klasse zu erben, sie jedoch als nicht angefügte Abhängigkeitseigenschaft für Ihre Klasse verfügbar zu machen:

  • Rufen Sie auf AddOwner , um Ihre Klasse als Besitzer der angefügten Abhängigkeitseigenschaft hinzuzufügen.

  • Weisen Sie den Rückgabewert des AddOwner Aufrufs einem public static readonly Feld für die Verwendung als Bezeichner der Abhängigkeitseigenschaft zu.

  • Definieren Sie einen CLR-Wrapper, der die Eigenschaft als Klassenelement hinzufügt und die Verwendung nicht angefügter Eigenschaften unterstützt.

Siehe auch