Freigeben über


Eigenschaftenänderungsereignisse (WPF .NET)

Windows Presentation Foundation (WPF) definiert mehrere Ereignisse, die als Antwort auf eine Änderung des Werts einer Eigenschaft ausgelöst werden. Häufig ist die Eigenschaft eine Abhängigkeitseigenschaft. Das Ereignis selbst kann ein Routingereignis oder ein CLR-Standardereignis (Common Language Runtime) sein – je nachdem, ob das eine Elementstruktur durchlaufen oder nur für das Objekt auftreten soll, bei dem sich die Eigenschaft geändert hat. Das letzte Szenario gilt, wenn eine Eigenschaftenänderung nur für das Objekt relevant ist, bei dem sich der Eigenschaftswert geändert hat.

Wichtig

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

Voraussetzungen

In diesem Artikel wird davon ausgegangen, dass Sie über grundlegende Kenntnisse im Zusammenhang mit Abhängigkeitseigenschaften verfügen und sich mit der Übersicht über Abhängigkeitseigenschaften vertraut gemacht haben.

Identifizieren eines Eigenschaftenänderungsereignisses

Nicht alle Ereignisse, die eine Eigenschaftenänderung melden, werden explizit über ihre Signatur oder über ihr Benennungsmuster als Eigenschaftenänderungsereignis identifiziert. Die SDK-Dokumentation enthält Querverweise für Eigenschaften mit Ereignissen, und es wird angegeben, ob ein Ereignis direkt an eine Änderung des Eigenschaftswerts gebunden ist.

Bei einigen Ereignissen werden ein spezifischer Ereignisdatentyp und ein spezifischer Delegat für Eigenschaftenänderungsereignisse verwendet. Ereignisse vom Typ RoutedPropertyChanged und DependencyPropertyChanged verfügen beispielsweise beide über spezifische Signaturen. Diese Ereignistypen werden in den folgenden Abschnitten beschrieben.

RoutedPropertyChanged-Ereignisse

RoutedPropertyChanged-Ereignisse verfügen über RoutedPropertyChangedEventArgs<T>-Ereignisdaten sowie über einen RoutedPropertyChangedEventHandler<T>-Delegaten. Sowohl die Ereignisdaten als auch der Delegat haben einen generischen Typparameter (T). Sie geben den tatsächlichen Typ der geänderten Eigenschaft an, wenn Sie den Handler definieren. Die Ereignisdaten enthalten die Eigenschaften OldValue und NewValue, deren Laufzeittyp dem Laufzeittyp der geänderten Eigenschaft entspricht.

Der „weitergeleitete“ Teil des Namens gibt an, dass das Eigenschaftenänderungsereignis als Routingereignis registriert ist. Der Vorteil eines Eigenschaftenänderungsereignisses vom Typ Routingereignis besteht darin, dass übergeordnete Elemente benachrichtigt werden, wenn sich Eigenschaften untergeordneter Elemente ändern. Das bedeutet, dass das Element auf oberster Ebene eines Steuerelements Eigenschaftenänderungsereignisse empfängt, wenn sich der Wert einer seiner zusammengesetzten Komponenten ändert. Angenommen, Sie erstellen ein Steuerelement, das ein RangeBase-Steuerelement enthält – etwa einen Schieberegler (Slider). Wenn sich die Value-Eigenschaft für die Schiebereglerkomponente ändert, können Sie diese Änderung im übergeordneten Steuerelement anstatt in der Komponente behandeln.

Vermeiden Sie die Verwendung eines Eigenschaftenänderungsereignis-Handlers, um den Eigenschaftswert zu überprüfen, da dies bei den meisten Eigenschaftenänderungsereignissen nicht vorgesehen ist. Grundsätzlich wird das Eigenschaftenänderungsereignis bereitgestellt, um auf die Wertänderung in anderen Logikbereichen des Codes reagieren zu können. Es wird davon abgeraten, den Eigenschaftswerts innerhalb des Eigenschaftenänderungsereignis-Handlers erneut zu ändern. Dies kann je nach Implementierung des Handlers eine ungewollte Rekursion zur Folge haben.

Wenn es sich bei Ihrer Eigenschaft um eine benutzerdefinierte Abhängigkeitseigenschaft handelt oder Sie eine abgeleitete Klasse verwenden, in der Sie den Instanziierungscode definiert haben, bietet das WPF-Eigenschaftensystem eine bessere Möglichkeit zur Nachverfolgung von Eigenschaftenänderungen: die Verwendung der integrierten CoerceValueCallback- und PropertyChangedCallback-Eigenschaftensystemrückrufe. Weitere Informationen zur Verwendung des WPF-Eigenschaftensystems zur Überprüfung und Koersion finden Sie unter Rückrufe und Validierung von Abhängigkeitseigenschaften (WPF .NET) sowie unter Benutzerdefinierte Abhängigkeitseigenschaften (WPF .NET).

DependencyPropertyChanged-Ereignisse

DependencyPropertyChanged-Ereignisse verfügen über DependencyPropertyChangedEventArgs-Ereignisdaten sowie über einen DependencyPropertyChangedEventHandler-Delegaten. Bei diesen Ereignissen handelt es sich nicht um Routingereignisse, sondern um CLR-Standardereignisse. DependencyPropertyChangedEventArgs ist ein ungewöhnlicher Ereignisdaten-Berichtstyp, da er nicht von EventArgs abgeleitet ist. Außerdem handelt es sich hierbei nicht um eine Klasse, sondern um eine Struktur.

Ein Beispiel für ein DependencyPropertyChanged-Ereignis ist IsMouseCapturedChanged. DependencyPropertyChanged-Ereignisse werden etwas häufiger verwendet als RoutedPropertyChanged-Ereignisse.

Ähnlich wie RoutedPropertyChanged-Ereignisdaten enthalten auch DependencyPropertyChanged-Ereignisdaten die Eigenschaften OldValue und NewValue. Vermeiden Sie aus den bereits genannten Gründen die erneute Änderung des Eigenschaftswert mithilfe eines Eigenschaftenänderungsereignis-Handlers.

Eigenschaftstrigger

Ein eng mit einem Eigenschaftenänderungsereignis verbundenes Konzept ist ein Eigenschaftsauslöser. Ein Eigenschaftsauslöser wird in einer Formatvorlage oder in einer normalen Vorlage erstellt. Der Eigenschaftsauslöser ermöglicht die Erstellung eines bedingten Verhaltens basierend auf dem Wert der Eigenschaft, der der Eigenschaftsauslöser zugeordnet ist.

Die Eigenschaft, auf deren Grundlage ein Eigenschaftsauslöser agiert, muss eine Abhängigkeitseigenschaft sein. Häufig handelt es sich dabei um eine schreibgeschützte Abhängigkeitseigenschaft. Wenn der Name einer Abhängigkeitseigenschaft, die von einem Steuerelement verfügbar gemacht wird, einen mit „Is“ beginnt, ist das ein guter Indikator dafür, dass die Eigenschaft zumindest teilweise als Eigenschaftsauslöser konzipiert wurde. Eigenschaften mit dieser Benennung sind häufig schreibgeschützte Boolean-Abhängigkeitseigenschaften, deren primäre Aufgabe im Melden des Steuerelementzustands besteht. Wenn sich der Steuerelementzustand auf die Echtzeitbenutzeroberfläche auswirkt, ist die Abhängigkeitseigenschaft ein Kandidat für einen Eigenschaftsauslöser.

Einige Abhängigkeitseigenschaften verfügen über ein dediziertes Eigenschaftenänderungsereignis. IsMouseCaptured verfügt beispielsweise über das Eigenschaftenänderungsereignis IsMouseCapturedChanged. Die IsMouseCaptured-Eigenschaft ist schreibgeschützt, und ihr Wert wird vom Eingabesystem geändert. Das Eingabesystem löst das IsMouseCapturedChanged-Ereignis für jede Echtzeitänderung aus.

Einschränkungen für Eigenschaftsauslöser

Im Vergleich zu einem echten Eigenschaftenänderungsereignis weisen Eigenschaftsauslöser einige Einschränkungen auf.

Eigenschaftsauslöser basieren auf einer exakten Übereinstimmungslogik, bei der Sie einen Eigenschaftsnamen und einen bestimmten Wert für die Aktivierung des Auslösers angeben. z. B. <Setter Property="IsMouseCaptured" Value="true"> ... </Setter>. Aufgrund ihrer Syntax können die meisten Eigenschaftsauslöser nur für Boolean-Eigenschaften oder für Eigenschaften verwendet werden, die einen dedizierten Enumerationswert akzeptieren. Das Spektrum möglicher Werte muss überschaubar sein, um einen Trigger für jeden Fall definieren zu können. Manchmal sind Eigenschaftsauslöser nur für spezielle Werte vorhanden – etwa, wenn eine Elementanzahl null erreicht. Ein einzelner Auslöser kann nicht so festgelegt werden, dass er aktiviert wird, wenn sich ein Eigenschaftswert von einem bestimmten Wert (beispielsweise null) in einen anderen Wert ändert. Anstatt mehrere Auslöser für alle Fälle zu verwenden, in denen der Wert nicht null ist, empfiehlt es sich, einen Codeereignishandler zu implementieren oder ein Standardverhalten zu verwenden, das vom Auslöserzustand zurückwechselt, wenn der Wert ungleich null ist.

Die Syntax von Eigenschaftsauslösern ist mit einer if-Anweisung in der Programmierung vergleichbar. Wenn die Auslöserbedingung erfüllt ist, wird der Hauptteil des Eigenschaftsauslösers ausgeführt. Der Hauptteil eines Eigenschaftsauslösers ist kein Code, sondern Markup. Dieses Markup ist auf die Verwendung eines oder mehrerer Setter-Elemente beschränkt, um andere Eigenschaften des Objekts festzulegen, auf das die Formatvorlage oder die normale Vorlage angewendet wird.

Wenn die if-Bedingung eines Eigenschaftsauslösers über ein breites Spektrum möglicher Werte verfügt, empfiehlt es sich, diesen Eigenschaftswert außerhalb des Auslösers per Setter auf einen Standardwert festzulegen. Dadurch hat der Setter innerhalb des Auslösers Vorrang, wenn die Auslöserbedingung true lautet. Andernfalls hat der Setter außerhalb des Triggers Vorrang.

Eigenschaftsauslöser eigenen sich für Szenarien, in denen sich mindestens eine Darstellungseigenschaft basierend auf dem Zustand einer anderen Eigenschaft für das gleiche Element ändern soll.

Weitere Informationen zu Eigenschaftsauslösern finden Sie unter Erstellen von Formaten und Vorlagen.

Siehe auch