Metadaten für Abhängigkeitseigenschaften (WPF .NET)

Das Windows Presentation Foundation (WPF)-Eigenschaftssystem enthält ein Metadatenberichtssystem für Abhängigkeitseigenschaften. Die Informationen, die über das Metadatenberichtssystem zur Verfügung stehen, gehen über das hinaus, was über Reflexion oder allgemeine Common Language Runtime (CLR)-Merkmale verfügbar ist. Wenn Sie eine Abhängigkeitseigenschaft registrieren, haben Sie die Möglichkeit, Metadaten zu erstellen und ihr zuzuweisen. Wenn Sie von einer Klasse ableiten, die eine Abhängigkeitseigenschaft definiert, können Sie die Metadaten für die geerbte Abhängigkeitseigenschaft überschreiben. Wenn Sie Ihre Klasse als Besitzer einer Abhängigkeitseigenschaft hinzufügen, können Sie die Metadaten der geerbten Abhängigkeitseigenschaft überschreiben.

Wichtig

Der Desktopleitfaden zu .NET 7 und .NET 6 ist in Bearbeitung.

Voraussetzungen

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

Verwendung von Metadaten

Sie können Metadaten von Abhängigkeitseigenschaften abfragen, um die Merkmale einer Abhängigkeitseigenschaft zu untersuchen. Wenn das Eigenschaftssystem eine Abhängigkeitseigenschaft verarbeitet, greift er auf dessen Metadaten zu. Das Metadatenobjekt für eine Abhängigkeitseigenschaft kann die folgenden Informationstypen enthalten:

  • Der Standardwert der Abhängigkeitseigenschaft, der vom Eigenschaftssystem festgelegt wird, wenn kein anderer Wert zutrifft, wie z. B. ein lokaler, Stil- oder Vererbungswert. Weitere Informationen zur Rangfolge der Werte während der Laufzeitzuweisung von Abhängigkeitseigenschaftswerten finden Sie unter Rangfolge der Abhängigkeitseigenschaftswerte.

  • Verweise auf Rückrufe von Koersionswerten und Rückrufe von Eigenschaftsänderungen zum Besitzertyp. 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 zu Abhängigkeitseigenschaften finden Sie unter Rückrufe und Validierung von Abhängigkeitseigenschaften.

  • Merkmale der Abhängigkeitseigenschaft auf WPF-Frameworkebene (wenn die Abhängigkeitseigenschaft eine WPF-Frameworkeigenschaft ist). WPF-Prozesse, z. B. das Frameworklayoutmodul und die Eigenschaftenvererbungslogik, fragen WPF-Metadaten auf Frameworkebene ab. Weitere Informationen finden Sie unter Framework-Eigenschaftenmetadaten.

Metadaten-APIs

Die PropertyMetadata-Klasse speichert die meisten Metadaten, die vom Eigenschaftssystem verwendet werden. Metadateninstanzen können erstellt und zugewiesen werden durch:

  • Typen, die Abhängigkeitseigenschaften beim Eigenschaftssystem 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 registriert, ohne Metadaten anzugeben, weist das Eigenschaftssystem der Abhängigkeitseigenschaft ein PropertyMetadata-Objekt mit Standardwerten für diesen Typ zu.

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

Spezifischere Metadatenklassen, abgeleitet von PropertyMetadata, sind für verschiedene architekturbezogene Bereiche vorhanden. Zum Beispiel unterstützt UIPropertyMetadata Animationsberichte und FrameworkPropertyMetadata unterstützt WPF-Frameworkeigenschaften. Abhängigkeitseigenschaften können auch mit den von PropertyMetadata abgeleiteten Klassen registriert werden. Obwohl GetMetadata ein PropertyMetadata-Objekt zurückgibt, können Sie gegebenenfalls auf einen abgeleiteten Typ wechseln, um typspezifische Eigenschaften zu untersuchen.

Die Eigenschafteneigenschaften, die Ihnen von FrameworkPropertyMetadata verfügbar gemacht werden, werden manchmal als Flags bezeichnet. Wenn Sie eine FrameworkPropertyMetadata-Instanz erstellen, haben Sie die Möglichkeit, eine Instanz des Enumerationstyps FrameworkPropertyMetadataOptions in den FrameworkPropertyMetadata-Konstruktor zu übergeben. FrameworkPropertyMetadataOptions ermöglicht Ihnen die Angabe von Metadaten-Flags in bitweiser Kombination. Die FrameworkPropertyMetadata verwenden FrameworkPropertyMetadataOptions, um die Länge der Konstruktorsignatur angemessen zu halten. Bei der Registrierung von Abhängigkeitseigenschaften werden die Metadatenflags, die Sie für FrameworkPropertyMetadataOptions gesetzt haben, in FrameworkPropertyMetadata als Boolean-Eigenschaften und nicht als bitweise Kombination von Flags angezeigt, um die Abfrage von Metadatenmerkmalen intuitiver zu gestalten.

Überschreiben oder Erstellen neuer Metadaten?

Wenn Sie eine Abhängigkeitseigenschaft erben, können Sie die Merkmale der Abhängigkeitseigenschaft ändern, indem Sie die Metadaten überschreiben. Sie können jedoch möglicherweise nicht immer Ihr Abhängigkeitseigenschaftsszenario ausführen, indem Metadaten überschrieben werden, und manchmal ist es erforderlich, eine benutzerdefinierte Abhängigkeitseigenschaft in Ihrer Klasse mit neuen Metadaten zu definieren. Benutzerdefinierte Abhängigkeitseigenschaften verfügen über dieselben Funktionen wie Abhängigkeitseigenschaften, die von WPF-Typen definiert sind. Weitere Informationen finden Sie unter Benutzerdefinierte Abhängigkeitseigenschaften.

Ein wichtiges Merkmal einer Abhängigkeitseigenschaft, das nicht überschrieben werden kann, ist der Werttyp. Wenn eine geerbte Abhängigkeitseigenschaft das ungefähre Verhalten aufweist, das Sie benötigen, aber Ihr Szenario einen anderen Werttyp erfordert, sollten Sie eine benutzerdefinierte Abhängigkeitseigenschaft implementieren. Möglicherweise können Sie die Eigenschaftenwerte über die Typkonvertierung oder eine andere Implementierung in Ihrer abgeleiteten Klasse verknüpfen.

Szenarien zum Überschreiben von Metadaten

Beispielszenarien zum Überschreiben vorhandener Abhängigkeitseigenschaftsmetadaten sind:

  • Ändern des Standardwerts, was ein gängiges Szenario ist.

  • Ändern oder Hinzufügen von Eigenschaftsänderungs-Rückrufen, was möglicherweise erforderlich sein kann, wenn eine geerbte Abhängigkeitseigenschaft mit anderen Abhängigkeitseigenschaften anders interagiert als die Basisimplementierung. Eines der Merkmale eines Programmiermodells, das Code und Markup unterstützt, ist, dass Eigenschaftenwerte in beliebiger Reihenfolge festgelegt werden können. Dieser Faktor kann sich darauf auswirken, wie Sie Rückrufe von Eigenschaftenänderungen implementieren. Weitere Informationen finden Sie unter Rückrufe und Überprüfung von Abhängigkeitseigenschaften.

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

Hinweis

Da Überprüfungsrückrufe nicht Teil der Metadaten sind, können sie nicht geändert werden, indem Metadaten überschrieben werden. Weitere Informationen finden Sie unter Rückrufe von Validierungswerten.

Überschreiben von Metadaten

Wenn Sie eine neue Abhängigkeitseigenschaft implementieren, können Sie dessen Metadaten mithilfe von Überladungen der Register-Methode festlegen. Wenn Ihre Klasse eine Abhängigkeitseigenschaft erbt, können Sie geerbte Metadatenwerte mithilfe der OverrideMetadata-Methode überschreiben. Beispielsweise können Sie OverrideMetadata auf typspezifische Werte festlegen. 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 Klasse Control leitet sich von FrameworkElement ab, erbt die Abhängigkeitseigenschaft Focusable und überschreibt die geerbten Eigenschaftsmetadaten. Das Überschreiben ändert den Standardwert der Eigenschaft von false zu true, behält jedoch andere geerbte Metadatenwerte bei.

Da die meisten existierenden Abhängigkeitseigenschaften keine virtuellen Eigenschaften sind, führt ihre geerbte Implementierung das Shadowing für das existierende Member durch. Wenn Sie eine Metadateneigenschaft überschreiben, ersetzt der neue Metadatenwert entweder den ursprünglichen Wert, oder sie werden zusammengeführt:

  • Für einen DefaultValue ersetzt der neue Wert den vorhandenen Standardwert. Wenn Sie keinen DefaultValue in den Überschreibungsmetadaten angeben, stammt der Wert aus dem nächsten Vorgänger in der Vererbungskette, der einen DefaultValue in den Metadaten angegeben hat.

  • Für einen PropertyChangedCallback speichert die Standardzusammenführungslogik alle PropertyChangedCallback-Werte in einer Tabelle, und alle werden auf einer Eigenschaftsänderung aufgerufen. Die Rückrufreihenfolge wird durch die Klassentiefe bestimmt, wobei ein Rückruf, der von der Basisklasse in der Hierarchie registriert wurde, zuerst ausgeführt wird.

  • Für einen CoerceValueCallback ersetzt der neue Wert einen vorhandenen CoerceValueCallback-Wert. Wenn Sie keinen CoerceValueCallback in den Überschreibungsmetadaten angeben, stammt der Wert aus dem nächsten Vorgänger in der Vererbungskette, der einen CoerceValueCallback in den Metadaten angegeben hat.

Hinweis

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

Hinzufügen einer Klasse als Besitzer

Um eine Abhängigkeitseigenschaft zu „erben“, die in einer anderen Klassenhierarchie registriert ist, verwenden Sie die AddOwner-Methode. Diese Methode wird in der Regel verwendet, wenn die hinzufügende Klasse nicht vom Typ abgeleitet wird, der die Abhängigkeitseigenschaft registriert hat. Im AddOwner-Aufruf kann die hinzufügende Klasse typspezifische Metadaten für die geerbte Abhängigkeitseigenschaft erstellen und zuweisen. Um ein vollständiger Teilnehmer im Eigenschaftssystem zu sein, sollte die hinzufügende Klasse über Code und Markup diese öffentlichen Member implementieren:

  • Ein Bezeichnerfeld für die Abhängigkeitseigenschaft. Der Wert des Abhängigkeitseigenschaftsbezeichners ist der Rückgabewert des AddOwner-Aufrufs. Dieses Feld sollte ein public static readonly-Feld vom Typ DependencyPropertysein.

  • Ein CLR-Wrapper, der die Zugriffmethoden get und set implementiert. Mithilfe eines Eigenschaftenwrappers können Consumer von Abhängigkeitseigenschaften deren Werte so abrufen oder festlegen, wie bei jeder anderen CLR-Eigenschaft. Die Zugriffsmethoden get und set interagieren mit dem zugrunde liegenden Eigenschaftensystem durch DependencyObject.GetValue- und DependencyObject.SetValue-Aufrufe, wobei der Abhängigkeitseigenschaftsbezeichner als Parameter übergeben wird. Implementieren Sie den Wrapper genauso wie beim Registrieren einer benutzerdefinierten Abhängigkeitseigenschaft. Weitere Informationen finden Sie unter Benutzerdefinierte Abhängigkeitseigenschaften.

Eine Klasse, die AddOwner aufruft, hat die gleichen Anforderungen zum Verfügbarmachen 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 angefügter Eigenschaften

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

Hinweis

Verwenden Sie immer RegisterAttached, um Eigenschaften zu registrieren, in denen Sie in den Metadaten Inherits angeben. Obwohl die Vererbung von Eigenschaftswerten bei nicht angefügten Abhängigkeitseigenschaften zu funktionieren scheint, ist das Vererbungsverhalten von Werten einer nicht angefügten Eigenschaft über bestimmte Grenzen zwischen Objekten in der Laufzeitstruktur nicht festgelegt. Die Inherits-Eigenschaft ist für nicht angefügte Eigenschaften nicht relevant. Weitere Informationen finden Sie unter RegisterAttached(String, Type, Type, PropertyMetadata) und im Abschnitt „Hinweise“ von Inherits.

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

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

  • Rufen Sie AddOwner auf, 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 zu, um ihn als Abhängigkeitseigenschaftsbezeichner zu verwenden.

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

Weitere Informationen