Sdílet prostřednictvím


Události změny vlastností

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í je vhodnější směrovat přes strom prvků, zatímco jiné změny vlastností se týkají pouze 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, OldValue a NewValue, které se pak předávají jako argument typu v datech události.

Výraz "Routed" v 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 ovládací prvek RangeBase, jako je Slider. Pokud se hodnota vlastnosti Value změní v části posuvníku, možná budete chtít tuto změnu zpracovat u nadřazeného ovládacího prvku, 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í účelem návrhu většiny událostí změny 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ávislá vlastnost nebo pracujete s odvozenou třídou, kde jste definovali inicializační kód, existuje mnohem lepší mechanismus pro sledování změn vlastností, který je integrovaný v systému vlastností WPF: zpětná volání systému vlastností CoerceValueCallback a PropertyChangedCallback. Další podrobnosti o tom, jak můžete použít systém vlastností WPF pro validaci a donucení, naleznete v tématu zpětná volání a ověřování vlastností závislostí a vlastní vlastnosti závislostí.

DependencyPropertyChanged – události

Další dvojicí 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 vykazování dat událostí, protože nepochází z EventArgs; DependencyPropertyChangedEventArgs je struktura, nikoli třída.

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

Podobně jako RoutedPropertyChangedEventArgs<T>DependencyPropertyChangedEventArgs také hlásí starou a novou hodnotu vlastnosti. Také platí stejné úvahy o tom, co můžete dělat s hodnotami. Obecně se nedoporučuje snažit se znovu změnit hodnoty na straně odesílatele v reakci na událost.

Spouštěče vlastností

Úzce souvisejícím konceptem k události změny vlastnosti je spouštěcí mechanismus vlastnosti. Spouštěč vlastnosti se vytvoří ve stylu nebo šabloně a umožňuje vytvořit podmíněné chování na základě hodnoty vlastnosti, kde je spouštěč vlastnosti přiřazen.

Vlastnost pro aktivační událost musí být závislá vlastnost. 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. Například vlastnost IsMouseCaptured má událost změny vlastnosti IsMouseCapturedChanged. Vlastnost je pouze pro čtení, přičemž její hodnota je upravována vstupním systémem a vstupní systém vyvolává IsMouseCapturedChanged při každé reálné časové změně.

Ve srovnání s pravou událostí změny vlastnosti má použití spouštěče vlastnosti k provedení akce při změně vlastnosti určitá omezení.

Aktivátory 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í specifickou hodnotu z enumerace, kde je možný rozsah hodnot dostatečně zvládnutelný, aby bylo možné definovat trigger pro každý případ. Mohou existovat triggery vlastností pouze pro speciální hodnoty, například když počet položek dosáhne nuly, a neexistuje trigger pro případy, kdy se hodnota vlastnosti opět změní z nuly na jinou hodnotu. Místo triggerů pro všechny případy může být potřeba obslužná rutina události nebo výchozí chování, které se přepne zpět z triggery stavu, když hodnota není nulová.

Syntaxe spouště vlastnosti je podobná 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, je to značkování. Tento kód je omezen na použití jednoho nebo více prvků Setter k nastavení dalších vlastností objektu, ve kterém se používá styl nebo šablona.

K vyvážení podmínky 'if' spouštěče vlastnosti, který má širokou paletu možných hodnot, je obecně vhodné nastavit danou hodnotu vlastnosti na výchozí použitím Setter. Tímto způsobem bude mít obsažený setter Trigger prioritu, pokud je splněna podmínka triggeru, a Setter, která není v Trigger, bude mít prioritu, kdykoli není splněna podmínka triggeru.

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 triggerech vlastností najdete v tématu Styling a Templating.

Viz také

  • Přehled směrovaných událostí
  • Přehled vlastností závislosti