Vererbung von Eigenschaftswerten
Die Vererbung von Eigenschaftswerten ist ein Feature des WPF-Eigenschaftensystems (Windows Presentation Foundation). Durch die Vererbung von Eigenschaftswerten können untergeordnete Elemente in einer Elementstruktur den Wert einer bestimmten Eigenschaft von übergeordneten Elementen übernehmen. Dabei erben sie den Wert, der im nächsten übergeordneten Element festgelegt wurde. Das übergeordnete Element hat seinen Wert möglicherweise ebenfalls durch die Vererbung von Eigenschaftswerten erhalten, damit das System auf den Seitenstamm zurückgeführt werden kann. Die Vererbung von Eigenschaftswerten ist nicht das Standardverhalten eines Eigenschaftssystems. Eine Eigenschaft muss mit einer bestimmten Metadateneinstellung eingerichtet werden, damit diese die Vererbung von Eigenschaftswerten für untergeordnete Elemente veranlassen kann.
Die Vererbung von Eigenschaftswerten ist eine Einschlussvererbung
"Vererbung" als Begriff ist hier nicht ganz dasselbe Konzept wie die Vererbung im Kontext von Typen und allgemeiner objektorientierter Programmierung, wobei abgeleitete Klassen Memberdefinitionen von ihren Basisklassen erben. Diese Bedeutung von Vererbung gibt es auch in WPF: Eigenschaften, die in verschiedenen Basisklassen definiert sind, werden als Attribute für abgeleitete XAML-Klassen verfügbar gemacht, wenn sie als Elemente verwendet und dem Code als Member verfügbar gemacht werden. Bei der Vererbung von Eigenschaftswerten geht es insbesondere darum, wie Eigenschaftswerte auf Basis der über-und untergeordneten Beziehungen in einer Elementstruktur von einem Element an ein anderes vererbt werden können. Diese Elementstruktur ist unmittelbar sichtbar, wenn Sie bei der Definition von Anwendungen im XAML-Markup Elemente innerhalb anderer Elemente schachteln. Objektbäume können auch programmgesteuert erstellt werden, indem Objekte zu bestimmten Sammlungen anderer Objekte hinzugefügt werden, und die Eigenschaftswertvererbung funktioniert auf die gleiche Weise im fertigen Baum während der Laufzeit.
Anwendungsfälle für die Vererbung von Eigenschaftswerten
Die WPF-APIs enthalten mehrere Eigenschaften, für die die Eigenschaftsvererbung aktiviert ist. Üblicherweise beinhalten sie eine Eigenschaft, die, sofern angemessen, nur einmal pro Seite festgelegt wird, jedoch gleichzeitig ein Member von einer der Basiselementklassen ist und daher auch in den meisten untergeordneten Elementen vorhanden wäre. Beispielsweise steuert die Eigenschaft FlowDirection die Richtung des Inhaltsflusses und die Darstellung und Anordnung auf der Seite. In der Regel sollte das Textflusskonzept in allen untergeordneten Elementen einheitlich behandelt werden. Wenn die Flussrichtung aus irgendeinem Grund in einer Ebene der Elementstruktur manuell oder durch Umgebungsaktionen zurückgesetzt wurde, sollten sie in der Regel in der gesamten Elementstruktur zurückgesetzt werden. Wenn Sie die Eigenschaft FlowDirection vererben, muss der Wert nur einmalig auf der Ebene der Elementstruktur festgelegt oder zurückgesetzt werden, die die Präsentationsanforderungen jeder Seite in der Anwendung umfasst. Auch der initiale Standardwert erbt auf diese Weise. Das Eigenschaftswert-Vererbungsmodell kann weiterhin einzelne Elemente aktivieren, um den Wert in den seltenen Fällen zurückzusetzen, in denen eine Mischung aus Flussrichtungen beabsichtigt ist.
Vererbbarmachen einer benutzerdefinierten Eigenschaft
Durch Ändern der Metadaten einer benutzerdefinierten Eigenschaft können Sie auch eigene benutzerdefinierte Eigenschaften vererbbar machen. Beachten Sie jedoch, dass die Kennzeichnung einer Eigenschaft als vererbbar einige Leistungsaspekte berücksichtigt. In Fällen, in denen diese Eigenschaft keinen festgelegten lokalen Wert oder einen Wert hat, der durch die Stile, Vorlagen oder Datenbindung erhalten wird, stellt eine vererbbare Eigenschaft allen untergeordneten Elemente in der logischen Struktur ihre zugewiesenen Eigenschaftswerte zur Verfügung.
Erstellen Sie, wie unter Registrieren einer angefügten Eigenschaft beschrieben, eine benutzerdefinierte angefügte Eigenschaft, um eine Eigenschaft an der Vererbung von Eigenschaftswerten zu beteiligen. Registrieren Sie die Eigenschaft mit Metadaten (FrameworkPropertyMetadata), und geben Sie die Option „Inherits“ in den Optionseinstellungen innerhalb dieser Metadaten an. Stellen Sie außerdem sicher, dass die Eigenschaft einen festgelegten Standardwert hat, da dieser Wert nun vererbt wird. Obwohl Sie die Eigenschaft als angehängt registriert haben, empfiehlt es sich auch, einen „Eigenschaftenwrapper“ für den Abruf-/Festlegungszugriff auf den Besitzertyp zu erstellen, genauso wie Sie es bei einer „nicht angefügten“ Abhängigkeitseigenschaft machen würden. Danach kann die vererbbare Eigenschaft entweder mit dem direkten Eigenschaftenwrapper auf den Besitzertyp oder abgeleitete Typen festgelegt werden oder mit der angefügten Eigenschaftssyntax für ein beliebiges DependencyObject festgelegt werden.
Angefügte Eigenschaften ähneln vom Konzept her den globalen Eigenschaften. Sie können den Wert für ein beliebiges DependencyObject überprüfen und erhalten ein gültiges Ergebnis. Angefügte Eigenschaften sind üblicherweise dafür zuständig, Eigenschaftswerte von untergeordneten Elementen festzulegen. Dieses Szenario ist effektiver, wenn die betreffende Eigenschaft eine angefügte Eigenschaft ist, die immer implizit als angefügte Eigenschaft in jedem Element (DependencyObject) der Struktur vorhanden ist.
Anmerkung
Obwohl es möglicherweise so scheint, als würde die Vererbung von Eigenschaftswerten bei nicht angefügten Abhängigkeitseigenschaften funktionieren, ist das Vererbungsverhalten bei nicht angefügten Eigenschaften jenseits bestimmter Elementgrenzen in der Laufzeitstruktur nicht definiert. Verwenden Sie immer RegisterAttached, um Eigenschaften zu registrieren, bei denen Sie Inherits in den Metadaten angeben.
Vererbung von Eigenschaftswerten jenseits der Strukturgrenzen
Vererbung erfolgt durch die Traversierung einer Elementstruktur. Diese Struktur ist häufig parallel zur logischen Struktur. Wenn Sie jedoch ein WPF-Objekt auf Kernebene in das Markup einschließen, das eine Elementstruktur definiert, wie z. B. ein Brush, haben Sie einen diskontinuierlichen logischen Baum erstellt. Eine echte logische Struktur hat konzeptionell keine Überschneidungen mit Brush, da die logische Struktur ein Konzept auf Ebene des WPF-Frameworks ist. Sie können dies in den Ergebnissen sehen, wenn Sie die Methoden von LogicalTreeHelperverwenden. Die Vererbung von Eigenschaftswerten kann diese Lücke in der logischen Struktur jedoch schließen und vererbte Werte dennoch übergeben, solange die vererbbare Eigenschaft als angefügte Eigenschaft registriert wurde und keine absichtlich etablierte Grenze (z. B. Frame) ermittelt wird, die die Vererbung verhindert.
Weitere Informationen
.NET Desktop feedback