Freigeben über


Eigenschaftsänderungsereignisse

Windows Presentation Foundation (WPF) definiert mehrere Ereignisse, die als Reaktion auf eine Änderung des Werts einer Eigenschaft ausgelöst werden. Häufig handelt es sich bei der Eigenschaft um eine Abhängigkeitseigenschaft. Das Ereignis selbst ist manchmal ein Routingereignis und ist manchmal ein Standard-Common Language Runtime (CLR)-Ereignis. Die Definition des Ereignisses variiert je nach Szenario, da einige Eigenschaftsänderungen besser durch eine Elementstruktur weitergeleitet werden, während andere Eigenschaftsänderungen im Allgemeinen nur das Objekt betreffen, in dem sich die Eigenschaft geändert hat.

Identifizieren eines Eigenschaftsänderungsereignisses

Nicht alle Ereignisse, die eine Eigenschaftsänderung anzeigen, werden explizit als Eigenschaftsänderungsereignis identifiziert, entweder anhand eines Signaturmusters oder eines Benennungsmusters. Im Allgemeinen gibt die Beschreibung des Ereignisses in der SDK-Dokumentation an, ob das Ereignis direkt an eine Eigenschaftswertänderung gebunden ist und Querverweise zwischen der Eigenschaft und dem Ereignis bereitstellt.

RoutedPropertyChanged-Ereignisse

Bestimmte Ereignisse verwenden einen Ereignisdatentyp und einen Delegaten, der explizit für Eigenschaftsänderungsereignisse verwendet wird. Der Ereignisdatentyp ist RoutedPropertyChangedEventArgs<T>, und der Delegat ist RoutedPropertyChangedEventHandler<T>. Sowohl die Ereignisdaten als auch die Stellvertretung haben einen generischen Typparameter, der genutzt wird, um den tatsächlichen Typ der ändernden Eigenschaft anzugeben, wenn Sie den Handler definieren. Die Ereignisdaten enthalten zwei Eigenschaften, OldValue und NewValue, die beide dann als Typargument in den Ereignisdaten übergeben werden.

Der Teil "Routed" des Namens gibt an, dass das Eigenschaftsänderungsereignis als Routingereignis registriert wird. Der Vorteil des Routings eines Eigenschaftsänderungsereignisses besteht darin, dass die oberste Ebene eines Steuerelements eigenschaftsänderungsereignisse empfangen kann, wenn Eigenschaften für die untergeordneten Elemente (die zusammengesetzten Teile des Steuerelements) Werte ändern. Sie können beispielsweise ein Steuerelement erstellen, das ein RangeBase-Steuerelement wie ein Sliderenthält. Wenn sich der Wert der Value-Eigenschaft im Schiebereglerteil ändert, sollten Sie diese Änderung im übergeordneten Steuerelement statt im Teil behandeln.

Da Sie über einen alten Wert und einen neuen Wert verfügen, kann es verlockend sein, diesen Ereignishandler als Validator für den Eigenschaftswert zu verwenden. Dies ist jedoch nicht die Absicht des Designs von den meisten Eigenschaftsänderungsereignissen. Im Allgemeinen werden die Werte bereitgestellt, damit Sie mit ihnen in anderen Logikbereichen Ihres Codes arbeiten können. Tatsächlich ist es jedoch nicht ratsam, die Werte innerhalb des Ereignishandlers zu ändern, da dies je nach Implementierung des Handlers unbeabsichtigte Rekursion verursachen kann.

Wenn Ihre Eigenschaft eine benutzerdefinierte Abhängigkeitseigenschaft ist oder Sie mit einer abgeleiteten Klasse arbeiten, in der Sie den Instanziierungscode definiert haben, existiert ein wesentlich besserer Mechanismus zur Nachverfolgung von Eigenschaftenänderungen, der im WPF-Eigenschaftensystem integriert ist: die Rückrufe des Eigenschaftensystems CoerceValueCallback und PropertyChangedCallback. Weitere Informationen dazu, wie Sie das WPF-Eigenschaftensystem zur Überprüfung und Erzwingung verwenden können, finden Sie unter Rückrufe und Validierung bei Abhängigkeitseigenschaften und Benutzerdefinierte Abhängigkeitseigenschaften.

DependencyPropertyChanged-Ereignisse

Ein weiteres Paar von Typen, die Teil eines Ereignisszenarios mit Eigenschaftsänderung sind, ist DependencyPropertyChangedEventArgs und DependencyPropertyChangedEventHandler. Ereignisse für diese Eigenschaftsänderungen werden nicht weitergeleitet; sie sind standardmäßige CLR-Ereignisse. DependencyPropertyChangedEventArgs ist ein ungewöhnlicher Ereignisdatenberichtstyp, da er nicht von EventArgsabgeleitet wird; DependencyPropertyChangedEventArgs ist eine Struktur, keine Klasse.

Ereignisse, die DependencyPropertyChangedEventArgs und DependencyPropertyChangedEventHandler verwenden, sind etwas häufiger als RoutedPropertyChanged Ereignisse. Ein Beispiel für ein Ereignis, das diese Typen verwendet, ist IsMouseCapturedChanged.

Wie RoutedPropertyChangedEventArgs<T>meldet auch DependencyPropertyChangedEventArgs sowohl einen alten als auch einen neuen Wert für die Eigenschaft. Beachten Sie auch, dass die gleichen Überlegungen hinsichtlich dessen gelten, was Sie mit den Werten tun können; es wird im Allgemeinen nicht empfohlen, die Werte auf der Senderseite als Reaktion auf das Ereignis erneut zu ändern.

Eigenschaftentrigger

Ein eng verwandtes Konzept zu einem Eigenschaftsänderungsereignis ist ein Eigenschaftstrigger. Ein Eigenschaftentrigger wird innerhalb eines Stils oder einer Vorlage erstellt und ermöglicht es, ein bedingtes Verhalten zu schaffen, das auf dem Wert der Eigenschaft basiert, dem der Eigenschaftentrigger zugewiesen ist.

Die Eigenschaft für einen Eigenschaftsauslöser muss eine abhängige Eigenschaft sein. Es kann (und ist häufig) eine schreibgeschützte Abhängigkeitseigenschaft sein. Ein guter Indikator dafür, dass eine von einem Steuerelement bereitgestellte Abhängigkeitseigenschaft zumindest teilweise als Trigger konzipiert ist, ist es, wenn der Name der Eigenschaft mit "Is" beginnt. Eigenschaften, die diese Bezeichnung aufweisen, sind häufig schreibgeschützte boolesche Abhängigkeitseigenschaften, bei denen das primäre Szenario den Steuerelementstatus meldet, der Auswirkungen auf die Benutzeroberfläche in Echtzeit haben kann und somit als Kandidat für einen Eigenschaftstrigger in Frage kommt.

Einige dieser Eigenschaften haben auch ein dediziertes Eigenschaftsänderungsereignis. Die Eigenschaft IsMouseCaptured verfügt beispielsweise über ein Eigenschaftsänderungsereignis IsMouseCapturedChanged. Die Eigenschaft selbst ist schreibgeschützt, wobei ihr Wert vom Eingabesystem angepasst wird, und das Eingabesystem löst IsMouseCapturedChanged für jede Echtzeitänderung aus.

Im Vergleich zu einem echten Eigenschaftsänderungsereignis weist die Verwendung eines Eigenschaftstriggers zum Reagieren auf eine Eigenschaftsänderung einige Einschränkungen auf.

Eigenschaftstrigger funktionieren mit einer Logik der genauen Übereinstimmung. Sie geben eine Eigenschaft und einen Wert an, der den spezifischen Wert angibt, für den der Trigger fungiert. Beispiel: <Setter Property="IsMouseCaptured" Value="true"> ... </Setter>. Aufgrund dieser Einschränkung sind die meisten Verwendungen von Eigenschaftstriggern für boolesche Eigenschaften oder Eigenschaften bestimmt, die einen dedizierten Enumerationswert verwenden, wobei der mögliche Wertbereich überschaubar genug ist, um einen Trigger für jeden Fall zu definieren. Oder Eigenschaftsauslöser sind möglicherweise nur für spezielle Werte vorhanden, z. B. wenn eine Elementanzahl null erreicht, und es wäre kein Trigger vorhanden, der für die Fälle verantwortlich wäre, in denen der Eigenschaftswert wieder von Null wechselt (anstelle von Triggern für alle Fälle, benötigen Sie hier möglicherweise einen Codeereignishandler oder ein Standardverhalten, das wieder aus dem Triggerzustand wechselt, wenn der Wert nicht null ist).

Die Syntax des Eigenschaftstriggers ist vergleichbar mit einer "if"-Anweisung in der Programmierung. Wenn die Auslösebedingung "wahr" ist, wird der "Körper" des Eigenschaftstriggers "ausgeführt". Der "body" eines Eigenschaften-Triggers ist kein Code, sondern Markup. Dieses Markup ist auf die Verwendung eines oder mehrerer Setter Elemente beschränkt, um andere Eigenschaften des Objekts festzulegen, an dem die Stilvorlage oder Vorlage angewendet wird.

Um die "if"-Bedingung eines Eigenschaftsauslösers mit einer Vielzahl möglicher Werte zu versatzen, empfiehlt es sich im Allgemeinen, diesen Eigenschaftswert mithilfe einer Setterauf einen Standardwert festzulegen. Auf diese Weise hat der im Trigger enthaltene Setter Vorrang, wenn die Triggerbedingung wahr ist, während die Setter, die sich nicht innerhalb eines Trigger befindet, Vorrang hat, wenn die Triggerbedingung falsch ist.

Eigenschaftsauslöser sind in der Regel für Szenarien geeignet, in denen sich eine oder mehrere Darstellungseigenschaften ändern sollten, basierend auf dem Status einer anderen Eigenschaft für dasselbe Element.

Weitere Informationen zu Eigenschaftsauslösern finden Sie unter Formatieren und Vorlagen.

Siehe auch