Zdarzenia zmiany właściwości

Program Windows Presentation Foundation (WPF) definiuje kilka zdarzeń zgłaszanych w odpowiedzi na zmianę wartości właściwości. Często właściwość jest właściwością zależności. Samo zdarzenie jest czasami zdarzeniem kierowanym i czasami jest standardowym zdarzeniem środowiska uruchomieniowego języka wspólnego (CLR). Definicja zdarzenia różni się w zależności od scenariusza, ponieważ niektóre zmiany właściwości są bardziej odpowiednio kierowane przez drzewo elementów, podczas gdy inne zmiany właściwości są zwykle istotne tylko dla obiektu, w którym zmieniono właściwość.

Identyfikowanie zdarzenia zmiany właściwości

Nie wszystkie zdarzenia, które zgłaszają zmianę właściwości, są jawnie identyfikowane jako zdarzenie zmienione właściwości na podstawie wzorca podpisu lub wzorca nazewnictwa. Ogólnie rzecz biorąc, opis zdarzenia w dokumentacji zestawu SDK wskazuje, czy zdarzenie jest bezpośrednio powiązane ze zmianą wartości właściwości i zawiera odwołania krzyżowe między właściwością a zdarzeniem.

Zdarzenia RoutedPropertyChanged

Niektóre zdarzenia używają typu danych zdarzenia i delegata, które są jawnie używane dla zdarzeń zmiany właściwości. Typ danych zdarzenia to RoutedPropertyChangedEventArgs<T>, a pełnomocnik to RoutedPropertyChangedEventHandler<T>. Dane zdarzenia i delegat mają zarówno ogólny parametr typu, który służy do określania rzeczywistego typu właściwości zmieniającej się podczas definiowania programu obsługi. Dane zdarzenia zawierają dwie właściwości i OldValueNewValue, które są następnie przekazywane jako argument typu w danych zdarzenia.

Część "Routed" nazwy wskazuje, że zdarzenie zmienionej właściwości jest zarejestrowane jako zdarzenie kierowane. Zaletą rozsyłania zdarzenia zmiany właściwości jest to, że najwyższy poziom kontrolki może odbierać zdarzenia zmienione właściwości, jeśli właściwości elementów podrzędnych (części złożone kontrolki) zmieniają wartości. Na przykład możesz utworzyć kontrolkę zawierającą kontrolkę RangeBase , taką jak Slider. Jeśli wartość Value właściwości zmieni się w części suwaka, możesz chcieć obsłużyć zmianę w kontrolce nadrzędnej, a nie na części.

Ponieważ masz starą wartość i nową wartość, może być kuszące użycie tej procedury obsługi zdarzeń jako modułu sprawdzania poprawności dla wartości właściwości. Nie jest to jednak intencja projektowania większości zdarzeń zmienionych właściwości. Ogólnie rzecz biorąc, wartości są udostępniane tak, aby można było wykonywać działania na tych wartościach w innych obszarach logiki kodu, ale faktycznie zmiana wartości z programu obsługi zdarzeń nie jest zalecana i może spowodować niezamierzoną rekursję w zależności od sposobu implementacji programu obsługi.

Jeśli właściwość jest niestandardową właściwością zależności lub jeśli pracujesz z klasą pochodną, w której zdefiniowano kod tworzenia wystąpienia, istnieje znacznie lepszy mechanizm śledzenia zmian właściwości wbudowanych w system właściwości WPF: wywołania CoerceValueCallback zwrotne systemu właściwości i PropertyChangedCallback. Aby uzyskać więcej informacji na temat sposobu używania systemu właściwości WPF do walidacji i przymusu, zobacz Wywołania zwrotne właściwości zależności i Walidacja i Właściwości zależności niestandardowych.

Zdarzenia DependencyPropertyChanged

Inną parą typów, które są częścią scenariusza zdarzenia zmienionego właściwości, jest DependencyPropertyChangedEventArgs i DependencyPropertyChangedEventHandler. Zdarzenia dla tych zmian właściwości nie są kierowane; są standardowymi zdarzeniami CLR. DependencyPropertyChangedEventArgsjest nietypowym typem raportowania danych zdarzeń, ponieważ nie pochodzi z EventArgsDependencyPropertyChangedEventArgs ; jest strukturą, a nie klasą.

Zdarzenia, które używają DependencyPropertyChangedEventArgs i DependencyPropertyChangedEventHandler są nieco bardziej typowe niż RoutedPropertyChanged zdarzenia. Przykładem zdarzenia, które używa tych typów, jest IsMouseCapturedChanged.

Podobnie jak RoutedPropertyChangedEventArgs<T>, DependencyPropertyChangedEventArgs raportuje również starą i nową wartość właściwości. Ponadto te same zagadnienia dotyczące tego, co można zrobić z wartościami, mają zastosowanie; zazwyczaj nie zaleca się ponownej zmiany wartości w nadawcy w odpowiedzi na zdarzenie.

Wyzwalacze właściwości

Ściśle powiązaną koncepcją ze zdarzeniem zmiany właściwości jest wyzwalacz właściwości. Wyzwalacz właściwości jest tworzony w stylu lub szablonie i umożliwia utworzenie zachowania warunkowego na podstawie wartości właściwości, do której jest przypisany wyzwalacz właściwości.

Właściwość wyzwalacza właściwości musi być właściwością zależności. Może to być (i często) właściwość zależności tylko do odczytu. Dobrym wskaźnikiem, gdy właściwość zależności uwidoczniona przez kontrolkę jest co najmniej częściowo zaprojektowana jako wyzwalacz właściwości, jest to, czy nazwa właściwości zaczyna się od "Is". Właściwości, które mają to nazewnictwo, są często właściwością zależności logicznej tylko do odczytu, w której podstawowym scenariuszem dla właściwości jest stan kontroli, który może mieć konsekwencje dla interfejsu użytkownika w czasie rzeczywistym, a tym samym jest kandydatem wyzwalacza właściwości.

Niektóre z tych właściwości mają również zdarzenie zmiany właściwości dedykowanej. Na przykład właściwość IsMouseCaptured ma zmienione zdarzenie IsMouseCapturedChanged. Sama właściwość jest tylko do odczytu, a jej wartość jest dostosowywana przez system wejściowy, a system wejściowy zgłasza IsMouseCapturedChanged zmiany w każdym czasie rzeczywistym.

W porównaniu z zdarzeniem zmiany właściwości true, użycie wyzwalacza właściwości do działania na podstawie zmiany właściwości ma pewne ograniczenia.

Wyzwalacze właściwości działają za pomocą dokładnej logiki dopasowania. Należy określić właściwość i wartość, która wskazuje konkretną wartość, dla której będzie działać wyzwalacz. Na przykład: <Setter Property="IsMouseCaptured" Value="true"> ... </Setter>. Ze względu na to ograniczenie większość użycia wyzwalacza właściwości będzie dotyczyć właściwości logicznych lub właściwości, które przyjmują dedykowaną wartość wyliczenia, gdzie możliwy zakres wartości jest wystarczająco zarządzany, aby zdefiniować wyzwalacz dla każdego przypadku. Lub wyzwalacze właściwości mogą istnieć tylko dla wartości specjalnych, takich jak gdy liczba elementów osiągnie zero, i nie będzie wyzwalacza, który odpowiada przypadkom, gdy wartość właściwości zmienia się od zera ponownie (zamiast wyzwalaczy dla wszystkich przypadków może być potrzebna procedura obsługi zdarzeń kodu tutaj lub domyślne zachowanie, które przełącza się z powrotem ze stanu wyzwalacza ponownie, gdy wartość jest niezerowa).

Składnia wyzwalacza właściwości jest analogiczna do instrukcji "if" w programowaniu. Jeśli warunek wyzwalacza ma wartość true, wyzwalacz właściwości "body" to "executed". Wyzwalacz właściwości "treść" nie jest kodem, jest to adiustacja. Ten znacznik jest ograniczony do używania co najmniej jednego Setter elementu do ustawiania innych właściwości obiektu, w którym jest stosowany styl lub szablon.

Aby zrównoważyć warunek "if" wyzwalacza właściwości, który ma szeroką gamę możliwych wartości, zazwyczaj zaleca się ustawienie tej samej wartości właściwości na wartość domyślną przy użyciu elementu Setter. W ten sposób zawarty Trigger setter będzie miał pierwszeństwo, gdy warunek wyzwalacza ma wartość true, a element, który Setter nie znajduje się w elemencie Trigger , będzie miał pierwszeństwo, gdy warunek wyzwalacza ma wartość false.

Wyzwalacze właściwości są zazwyczaj odpowiednie w scenariuszach, w których co najmniej jedna właściwość wyglądu powinna ulec zmianie na podstawie stanu innej właściwości na tym samym elemenie.

Aby dowiedzieć się więcej na temat wyzwalaczy właściwości, zobacz Styling and Templating (Styleing and Templating).

Zobacz też