Schreibgeschützte Abhängigkeitseigenschaften

Dieses Thema beschreibt die schreibgeschützten Abhängigkeitseigenschaften, einschließlich vorhandener schreibgeschützter Abhängigkeitseigenschaften und die Szenarien und Verfahren zum Erstellen einer benutzerdefinierten, schreibgeschützten Abhängigkeitseigenschaft.

Voraussetzungen

Bei diesem Thema wird davon ausgegangen, dass Sie die grundlegenden Szenarien zum Implementieren einer Abhängigkeitseigenschaft verstehen, und Metadaten für eine benutzerdefinierte Abhängigkeitseigenschaft anwenden. Weitere Informationen finden Sie unter Benutzerdefinierte Abhängigkeitseigenschaften und Metadaten für Abhängigkeitseigenschaften.

Bestehende schreibgeschützte Abhängigkeitseigenschaften

Einige der im WPF-Framework (Windows Presentation Foundation) definierten Abhängigkeitseigenschaften sind schreibgeschützt. Der Hauptgrund zum Festlegen einer schreibgeschützten Abhängigkeitseigenschaft ist, dass dies Eigenschaften sind, die zur Statusbestimmung verwendet werden sollen, allerdings wird dieser Status durch eine Vielzahl von Faktoren beeinflusst, wobei das einfache Festlegen der Eigenschaft in diesem Status aus der Perspektive des Benutzeroberflächendesigns nicht in Frage kommt. Angenommen, die IsMouseOver-Eigenschaft ist lediglich ein Oberflächenstatus, der durch die Mauseingabe bestimmt wird, dann wäre jeder Versuch, diesen Wert programmgesteuert - durch die Umgehung der echten Mauseingabe - festzulegen, unvorhersehbar und würde zu einer Inkonsistenz führen.

Schreibgeschützte Abhängigkeitseigenschaften sind nicht für zahlreiche Szenarien geeignet, für die Abhängigkeitseigenschaften normalerweise eine Lösung bieten, da sie nicht eingestellt werden können (genauer gesagt: Datenbindung, direkt auf einen Wert formatierbar, Überprüfung, Animation, Vererbung). Obwohl Sie nicht eingestellt werden können, verfügen schreibgeschützte Abhängigkeitseigenschaft immer noch über einige weitere Funktionen, die von Abhängigkeitseigenschaften im Eigenschaftssystem unterstützt werden. Die wichtigste verbleibende Funktion ist, dass die schreibgeschützte Abhängigkeitseigenschaft weiterhin als Eigenschaftstrigger in einem Stil verwendet werden kann. Sie können Trigger nicht mit einer normalen CLR-Eigenschaft (Common Language Runtime) aktivieren. Dies muss mit einer Abhängigkeitseigenschaft geschehen. Die oben genannte IsMouseOver-Eigenschaft ist ein perfektes Beispiel für ein Szenario, in dem es möglicherweise nützlich sein könnte einen Stil für ein Steuerelement festzulegen, indem einige sichtbare Eigenschaften wie Hintergrund, Vordergrund oder ähnliche Eigenschaften zusammengesetzter Elemente sich im Steuerelement ändern werden, wenn der Benutzer den Mauszeiger über einen definierten Bereich des Steuerelements führt. Änderungen in einer schreibgeschützten Abhängigkeitseigenschaft können auch ermittelt und durch den inhärenten Ungültigkeitsprozess des Eigenschaftssystems gemeldet werden, und dies unterstützt in der Tat intern die Eigenschaftsauslöserfunktionalität.

Erstellen benutzerdefinierter, schreibgeschützter Abhängigkeitseigenschaften

Lesen Sie auf jeden Fall den Abschnitt oben zum Thema: Warum schreibgeschützte Abhängigkeitseigenschaften für viele normale Abhängigkeitseigenschaftsszenarien nicht funktioniert. Wenn Sie ein entsprechendes Szenario haben, können Sie jedoch eine eigene schreibgeschützte Abhängigkeitseigenschaft erstellen.

Einiges des Prozesses zum Erstellen einer schreibgeschützten Abhängigkeitseigenschaft entspricht weitgehend den in benutzerdefinierte Abhängigkeitseigenschaften und Implementieren einer Abhängigkeitseigenschaft beschriebenen Themen. Es gibt drei wichtige Unterschiede:

  • Wenn Sie Ihre Eigenschaft registrieren, rufen Sie dazu die RegisterReadOnly-Methode anstelle der normalen Register-Methode auf.

  • Stellen Sie bei der Implementierung der CLR-Eigenschaft „Wrapper“ sicher, dass auch der Wrapper keine festgelegte Implementierung hat, sodass keine Inkonsistenzen im schreibgeschützten Status für den öffentlichen Wrapper entstehen, den Sie verfügbar machen.

  • Das von der schreibgeschützten Registrierung zurückgegebene Objekt ist DependencyPropertyKey und nicht DependencyProperty. Speichern Sie dieses Feld weiterhin als Member, aber normalerweise sollten Sie es nicht zu einem öffentlichen Member des Typs machen.

Alle privaten Felder oder Werte, die Ihre schreibgeschützte Abhängigkeitseigenschaft unterstützen, können natürlich vollständig von Ihrer gewünschten Logik beschreibbar sein. Die einfachste Möglichkeit zum Festlegen der Eigenschaft, ob am Anfang oder als Teil der Laufzeitlogik, ist jedoch das Verwenden der APIs des Eigenschaftensystems, anstatt das Eigenschaftensystem zu umgehen und das private Unterstützungsfeld direkt festzulegen. Insbesondere gibt es eine Signatur des Typs SetValue, die einen Parameter des Typs DependencyPropertyKey akzeptiert. Wie und wo Sie diesen Wert programmgesteuert in der Anwendungslogik festlegen, wirkt sich darauf aus, wie Sie den Zugriff auf DependencyPropertyKey festlegen möchten, die erstellt wird, wenn Sie erstmalig die Abhängigkeitseigenschaft registrieren. Wenn Sie diese Logik innerhalb der Klasse bearbeiten, können Sie diese als privat einstellen, oder wenn Sie möchten, dass diese von anderen Teilen des Assembly festgelegt wird, müssen Sie dies intern festlegen. Ein Ansatz besteht darin, SetValue innerhalb eines Klassenereignishandlers eines relevanten Ereignisses aufzurufen, der eine Klasseninstanz darüber informiert, dass der gespeicherte Eigenschaftswert geändert werden muss. Ein anderer Ansatz zum Verbinden von Abhängigkeitseigenschaften besteht darin, gepaarte Rückrufe von PropertyChangedCallback und CoerceValueCallback während der Registrierung als Teil der Metadaten dieser Eigenschaften zu verwenden.

Eine schreibgeschützte Abhängigkeitseigenschaft verfügt über eine bessere Einstellungssicherheit, als eine Abhängigkeitseigenschaft, die gelesen und bearbeitet werden kann, da DependencyPropertyKey privat ist und nicht vom Eigenschaftensystem außerhalb des Codes weitergegeben wird. Für eine Abhängigkeitseigenschaft, die gelesen und bearbeitet werden kann, ist das identifizierende Feld explizit oder implizit öffentlich und daher kann die Eigenschaft umfassend festgelegt werden. Ausführlichere Informationen dazu finden Sie unter Sicherheit von Abhängigkeitseigenschaften.

Weitere Informationen