Udostępnij za pośrednictwem


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. Zdarzenie samo w sobie bywa czasami zdarzeniem kierowanym, a czasami standardowym zdarzeniem środowiska uruchomieniowego języka współdzielonego (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 zdarzenia zmiany właściwości dzięki wzorcowi podpisu lub 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 zmiany właściwości 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 delegat to RoutedPropertyChangedEventHandler<T>. Dane zdarzenia i delegat mają parametr typu ogólnego, który służy do określenia rzeczywistego typu zmieniającej się właściwości podczas definiowania obsługi. Dane zdarzenia zawierają dwie właściwości, OldValue i NewValue, które są następnie przekazywane jako argument typu w danych zdarzenia.

Część nazwy "Routed" wskazuje, że zmiana właściwości jest zarejestrowana 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. Możesz na przykład utworzyć kontrolkę zawierającą kontrolkę RangeBase, taką jak Slider. Jeśli wartość właściwości Value zmienia 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 intencją projektową większości zdarzeń zmiany 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 Twoja właściwość jest niestandardową właściwością zależności, albo jeśli pracujesz z klasą pochodną, w której zdefiniowałeś kod tworzenia wystąpienia, istnieje znacznie lepszy mechanizm śledzenia zmian właściwości wbudowany w system właściwości WPF: wywołania zwrotne systemu właściwości CoerceValueCallback i PropertyChangedCallback. Aby uzyskać więcej informacji na temat sposobu używania systemu właściwości WPF do walidacji i wymuszenia, zobacz Wywołania zwrotne właściwości zależności i walidacji oraz niestandardowych właściwości zależności .

Zdarzenia DependencyPropertyChanged

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

Zdarzenia korzystające z DependencyPropertyChangedEventArgs i DependencyPropertyChangedEventHandler są nieco bardziej powszechne niż zdarzenia RoutedPropertyChanged. Przykładem zdarzenia korzystającego z tych typów jest IsMouseCapturedChanged.

Podobnie jak RoutedPropertyChangedEventArgs<T>, DependencyPropertyChangedEventArgs również zgłasza starą i nową wartość właściwości. Ponadto te same zasady dotyczą tego, co można zrobić z wartościami; na ogół nie zaleca się podejmowania prób zmiany tych 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ą tę nazwę, są często logicznymi właściwościami zależności tylko do odczytu, gdzie podstawowym zastosowaniem dla właściwości jest raportowanie stanu kontroli, który może mieć konsekwencje dla interfejsu użytkownika w czasie rzeczywistym, a tym samym jest kandydatem na wyzwalacz właściwości.

Niektóre z tych właściwości mają również dedykowane zdarzenie zmiany właściwości. Na przykład właściwość IsMouseCaptured ma zdarzenie zmiany właściwości IsMouseCapturedChanged. Właściwość ta jest tylko do odczytu, a jej wartość jest dostosowywana przez system wejściowy, który podnosi IsMouseCapturedChanged przy każdej zmianie zachodzącej w czasie rzeczywistym.

W porównaniu z prawdziwym zdarzeniem zmiany właściwości, użycie wyzwalacza właściwości do zareagowania na zmianę właściwości ma pewne ograniczenia.

Wyzwalacze właściwości działają za pomocą logiki dokładnego 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ść zastosowań wyzwalaczy właściwości będzie dotyczyć właściwości logicznych lub właściwości, które przyjmują przeznaczoną wartość wyliczeniową, gdzie możliwy zakres wartości jest wystarczająco ograniczony, 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 jest spełniony, wtedy "ciało" wyzwalacza właściwości zostaje "wykonane". "„Ciało” wyzwalacza właściwości nie jest kodem, jest to znaczniki." Ten znacznik ogranicza się do używania jednego lub więcej elementów Setter w celu ustawienia dodatkowych właściwości obiektu, w którym jest stosowany styl lub szablon.

Aby zrównoważyć działanie warunku "if" w wyzwalaczu właściwości, który posiada szeroką gamę możliwych wartości, zwykle zaleca się ustawienie tej samej wartości jako domyślnej, przy użyciu Setter. W ten sposób Trigger zawarty setter będzie miał pierwszeństwo, gdy warunek uruchamiający ma wartość true, a Setter, który nie znajduje się w Trigger, będzie miał pierwszeństwo, gdy warunek uruchamiający 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 Styleing and Templating.

Zobacz też