Sdílet prostřednictvím


Události změny vlastnosti

Windows Presentation Foundation (WPF) definuje několik událostí, které jsou vyvolány v reakci na změnu hodnoty vlastnosti. Vlastnost je často vlastnost závislosti. Samotná událost je někdy směrovanou událostí a někdy se jedná o standardní událost CLR (Common Language Runtime). Definice události se liší v závislosti na scénáři, protože některé změny vlastností jsou přesněji směrovány přes strom prvků, zatímco jiné změny vlastností jsou obecně pouze starostí objektu, kde se vlastnost změnila.

Identifikace události změny vlastnosti

Ne všechny události, které hlásí změnu vlastnosti, jsou explicitně identifikovány jako událost změněná vlastnost, a to buď na základě vzoru podpisu nebo vzoru pojmenování. Obecně platí, že popis události v dokumentaci sady SDK označuje, jestli je událost přímo svázaná se změnou hodnoty vlastnosti a poskytuje křížové odkazy mezi vlastností a událostí.

RoutedPropertyChanged – události

Některé události používají datový typ události a delegáta, které se explicitně používají pro události změny vlastností. Datový typ události je RoutedPropertyChangedEventArgs<T>a delegát je RoutedPropertyChangedEventHandler<T>. Data události i delegáti mají parametr obecného typu, který se používá k určení skutečného typu změny vlastnosti při definování obslužné rutiny. Data události obsahují dvě vlastnosti a OldValueNewValueobě jsou předány jako argument typu v datech události.

Část "Routed" názvu označuje, že událost změny vlastnosti je registrována jako směrovaná událost. Výhodou směrování změněné události vlastnosti je, že nejvyšší úroveň ovládacího prvku může přijímat události změny vlastností, pokud vlastnosti podřízených prvků (složené části ovládacího prvku) mění hodnoty. Můžete například vytvořit ovládací prvek, který zahrnuje RangeBase ovládací prvek, jako Sliderje například . Pokud se hodnota Value vlastnosti změní v části posuvníku, možná budete chtít tuto změnu zpracovat v nadřazené ovládací prvek, nikoli v části.

Protože máte starou hodnotu a novou hodnotu, může být lákavé použít tuto obslužnou rutinu události jako validátor pro hodnotu vlastnosti. To však není záměr návrhu většiny událostí změněných vlastností. Obecně platí, že hodnoty jsou poskytovány tak, abyste na tyto hodnoty mohli pracovat v jiných logických oblastech kódu, ale ve skutečnosti se změny hodnot z obslužné rutiny události nedoporučuje a mohou způsobit neúmyslnou rekurzi v závislosti na způsobu implementace obslužné rutiny.

Pokud je vaše vlastnost vlastní závislostí nebo pracujete s odvozenou třídou, kde jste definovali kód instance, existuje mnohem lepší mechanismus pro sledování změn vlastností, které jsou integrované v systému vlastností WPF: zpětné CoerceValueCallback volání systému vlastností a PropertyChangedCallback. Další podrobnosti o tom, jak můžete použít systém vlastností WPF pro ověřování a převod, naleznete v tématu Zpětné volání vlastností závislostí a ověřování a vlastní vlastnosti závislostí.

DependencyPropertyChanged – události

Další dvojici typů, které jsou součástí scénáře události změny vlastnosti, je DependencyPropertyChangedEventArgs a DependencyPropertyChangedEventHandler. Události těchto změn vlastností nejsou směrovány; jedná se o standardní události CLR. DependencyPropertyChangedEventArgs je neobvyklý typ generování sestav dat událostí, protože není odvozen od EventArgs; DependencyPropertyChangedEventArgs je struktura, nikoli třída.

Události, které používají DependencyPropertyChangedEventArgs a DependencyPropertyChangedEventHandler jsou o něco častější než RoutedPropertyChanged události. Příkladem události, která používá tyto typy, je IsMouseCapturedChanged.

DependencyPropertyChangedEventArgs Podobně jako RoutedPropertyChangedEventArgs<T>také hlásí starou a novou hodnotu vlastnosti. Také stejné aspekty týkající se toho, co můžete s hodnotami použít; Obecně se nedoporučuje, abyste se pokusili změnit hodnoty znovu u odesílatele v reakci na událost.

Aktivační události vlastností

Úzce související koncept se změněnou událostí vlastnosti je aktivační událost vlastnosti. Aktivační událost vlastnosti se vytvoří ve stylu nebo šabloně a umožňuje vytvořit podmíněné chování na základě hodnoty vlastnosti, ve které je aktivační událost vlastnosti přiřazena.

Vlastnost aktivační události vlastnosti musí být vlastnost závislosti. Může to být (a často se jedná) o vlastnost závislosti jen pro čtení. Dobrým indikátorem, kdy je vlastnost závislosti vystavená ovládacím prvku alespoň částečně navržená tak, aby byla triggerem vlastnosti, je, pokud název vlastnosti začíná na "Is". Vlastnosti, které mají toto pojmenování, jsou často logickou vlastností jen pro čtení, kde primární scénář vlastnosti hlásí stav ovládacího prvku, který může mít důsledky pro uživatelské rozhraní v reálném čase, a je tedy kandidátem na aktivaci vlastnosti.

Některé z těchto vlastností mají také vyhrazenou událost změny vlastnosti. Vlastnost má například IsMouseCaptured změněnou událost vlastnosti IsMouseCapturedChanged. Samotná vlastnost je jen pro čtení, přičemž její hodnota je upravena vstupním systémem a vstupní systém vyvolává IsMouseCapturedChanged při každé změně v reálném čase.

V porovnání se změněnou událostí skutečné vlastnosti má použití triggeru vlastnosti k akci na změně vlastnosti určitá omezení.

Triggery vlastností pracují s přesnou logikou shody. Zadáte vlastnost a hodnotu, která určuje konkrétní hodnotu, pro kterou se trigger bude chovat. Například: <Setter Property="IsMouseCaptured" Value="true"> ... </Setter>. Vzhledem k tomuto omezení bude většina použití triggerů vlastností pro logické vlastnosti nebo vlastnosti, které přebírají vyhrazenou hodnotu výčtu, kde je možný rozsah hodnot dostatečně spravovatelný k definování triggeru pro každý případ. Nebo triggery vlastností můžou existovat pouze pro speciální hodnoty, například když počet položek dosáhne nuly, a nedochází k žádnému triggeru, který by v případech, kdy se hodnota vlastnosti znovu změnila od nuly (místo triggerů pro všechny případy může být zde potřeba obslužná rutina události kódu nebo výchozí chování, které se znovu přepne ze stavu triggeru, když hodnota není nula).

Syntaxe triggeru vlastnosti je analogická k příkazu "if" v programování. Pokud je podmínka triggeru pravdivá, pak je text aktivační události vlastnosti "executed". Tělo triggeru vlastnosti není kód, jedná se o kód. Tento kód je omezen na použití jednoho nebo více Setter prvků k nastavení jiných vlastností objektu, ve kterém se používá styl nebo šablona.

Chcete-li odsazení podmínky "if" aktivační události vlastnosti, která má širokou škálu možných hodnot, je obecně vhodné nastavit stejnou hodnotu vlastnosti na výchozí pomocí Setter. Tímto způsobem bude mít obsažená Trigger setter přednost, když je podmínka triggeru pravdivá, a Setter hodnota, která není uvnitř Trigger , bude mít přednost vždy, když je podmínka triggeru nepravda.

Triggery vlastností jsou obecně vhodné pro scénáře, kdy by se měla změnit jedna nebo více vlastností vzhledu na základě stavu jiné vlastnosti na stejném prvku.

Další informace o aktivačních událostech vlastností najdete v tématu Styling a Šablonování.

Viz také