Zdarzenia zmiany właściwości (WPF .NET)

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 może być zdarzeniem kierowanym lub standardowym zdarzeniem środowiska uruchomieniowego języka wspólnego (CLR), w zależności od tego, czy zdarzenie powinno być kierowane przez drzewo elementów, czy występuje tylko w obiekcie, w którym zmieniono właściwość. Ten ostatni scenariusz ma zastosowanie, gdy zmiana właściwości ma zastosowanie tylko do obiektu, w którym zmieniono wartość właściwości.

Ważne

Dokumentacja przewodnika dla komputerów dla platform .NET 7 i .NET 6 jest w budowie.

Wymagania wstępne

W tym artykule przyjęto założenie, że masz podstawową wiedzę na temat właściwości zależności i zapoznasz się z omówieniem zdarzeń trasowanych.

Identyfikowanie zdarzenia zmienionej właściwości

Nie wszystkie zdarzenia, które zgłaszają zmianę właściwości, są jawnie identyfikowane jako zdarzenie zmienione przez ich sygnaturę lub wzorzec nazewnictwa. Dokumentacja zestawu SDK zawiera odwołania krzyżowe właściwości z zdarzeniami i wskazuje, czy zdarzenie jest bezpośrednio powiązane ze zmianą wartości właściwości.

Niektóre zdarzenia używają typu danych zdarzenia i delegata, które są specyficzne dla zdarzeń zmienionych właściwości. Na przykład zdarzenia RoutedPropertyChanged i DependencyPropertyChanged mają określone podpisy. Te typy zdarzeń zostały omówione w poniższych sekcjach.

Zdarzenia RoutedPropertyChanged

Zdarzenia RoutedPropertyChanged mają RoutedPropertyChangedEventArgs<T> dane zdarzeń i delegata RoutedPropertyChangedEventHandler<T> . Zarówno dane zdarzenia, jak i delegat mają ogólny parametr Ttypu . Podczas definiowania procedury obsługi należy określić rzeczywisty typ zmienionej właściwości. Dane zdarzenia zawierają OldValue właściwości i NewValue , których typ środowiska uruchomieniowego jest taki sam jak zmieniona właściwość.

Część "Routed" nazwy wskazuje, że zdarzenie zmienionej właściwości jest zarejestrowane jako zdarzenie kierowane. Zaletą zmienionego zdarzenia kierowanego właściwości jest to, że elementy nadrzędne są powiadamiane za każdym razem, gdy zmieniają się właściwości elementu podrzędnego. Oznacza to, że element najwyższego poziomu kontrolki odbiera zdarzenia zmienione właściwości, gdy wartość dowolnej z jego złożonych części się zmienia. Załóżmy na przykład, że tworzysz kontrolkę zawierającą SliderkontrolkęRangeBase, taką jak . Value Jeśli właściwość zmieni się na części suwaka, możesz obsłużyć zmianę w kontrolce nadrzędnej, a nie na części.

Unikaj używania procedury obsługi zdarzeń zmienionej właściwości, aby zweryfikować wartość właściwości, ponieważ nie jest to intencja projektu dla większości zdarzeń zmienionych właściwości. Ogólnie rzecz biorąc, zdarzenie zmiany właściwości jest udostępniane, aby można było reagować na zmianę wartości w innych obszarach logiki kodu. Zmiana wartości właściwości ponownie z wewnątrz właściwości zmienionej procedury obsługi zdarzeń nie jest zalecana i może spowodować niezamierzoną rekursję w zależności od 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, system właściwości WPF ma lepszy sposób śledzenia zmian właściwości. W ten sposób należy używać wbudowanych CoerceValueCallback wywołań zwrotnych systemu właściwości i PropertyChangedCallback właściwości. 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 Niestandardowe właściwości zależności.

Zdarzenia DependencyPropertyChanged

Zdarzenia DependencyPropertyChanged zawierają DependencyPropertyChangedEventArgs dane zdarzenia i delegata DependencyPropertyChangedEventHandler . Te zdarzenia to standardowe zdarzenia CLR, a nie zdarzenia kierowane. DependencyPropertyChangedEventArgs jest nietypowym typem raportowania danych zdarzeń, ponieważ nie pochodzi z EventArgs i jest strukturą, a nie klasą.

DependencyPropertyChanged Przykładem zdarzenia jest IsMouseCapturedChanged. DependencyPropertyChanged zdarzenia są nieco bardziej typowe niż RoutedPropertyChanged zdarzenia.

Podobnie jak w przypadku danych zdarzenia RoutedPropertyChanged, dane zdarzenia DependencyPropertyChanged zawierają OldValue właściwości i NewValue . Ze względów wymienionych wcześniej należy unikać ponownego zmieniania wartości właściwości za pomocą procedury obsługi zdarzeń zmiany właściwości.

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. Wyzwalacz właściwości umożliwia utworzenie zachowania warunkowego na podstawie wartości właściwości, do której jest przypisany wyzwalacz.

Właściwość, na której działa wyzwalacz właściwości, musi być właściwością zależności. Może to być i często jest właściwością zależności tylko do odczytu. Jeśli właściwość zależności uwidoczniona przez kontrolkę ma nazwę rozpoczynającą się od "Is", jest to dobry wskaźnik, że właściwość została co najmniej częściowo zaprojektowana jako wyzwalacz właściwości. Właściwości o tym nazewnictwie są często właściwościami zależności tylko Boolean do odczytu, w których podstawowym scenariuszem dla właściwości jest stan kontroli raportowania. Jeśli stan kontrolki wpływa na interfejs użytkownika w czasie rzeczywistym, właściwość zależności jest kandydatem wyzwalacza właściwości.

Niektóre właściwości zależności mają zdarzenie zmiany właściwości dedykowanej. Na przykład IsMouseCaptured właściwość zmieniła IsMouseCapturedChanged zdarzenie. Właściwość IsMouseCaptured jest tylko do odczytu, a jej wartość jest modyfikowana przez system wejściowy. System wejściowy zgłasza IsMouseCapturedChanged zdarzenie dla każdej zmiany w czasie rzeczywistym.

Ograniczenia wyzwalacza właściwości

W porównaniu z zdarzeniem zmiany właściwości true wyzwalacze właściwości mają pewne ograniczenia.

Wyzwalacze właściwości działają za pomocą dokładnej logiki dopasowania, gdzie należy określić nazwę właściwości i określoną wartość, która aktywuje wyzwalacz. Może to być na przykład <Setter Property="IsMouseCaptured" Value="true"> ... </Setter>. Składnia wyzwalacza właściwości ogranicza większość użycia właściwości do Boolean właściwości lub właściwości, które przyjmują dedykowaną wartość wyliczenia. Zakres możliwych wartości musi być zarządzany, aby można było zdefiniować wyzwalacz dla każdego przypadku. Czasami wyzwalacze właściwości istnieją tylko dla wartości specjalnych, takich jak wtedy, gdy liczba elementów osiągnie zero. Nie można ustawić pojedynczego wyzwalacza w celu aktywowania, gdy wartość właściwości zmienia się z dala od określonej wartości, takiej jak zero. Zamiast używać wielu wyzwalaczy dla wszystkich przypadków niezerowych, rozważ zaimplementowanie procedury obsługi zdarzeń kodu lub domyślne zachowanie, które przełącza się z powrotem ze stanu wyzwalacza, 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 "run". Wyzwalacz właściwości "treść" nie jest kodem, jego adiustacja. Ten znacznik jest ograniczony do używania co najmniej jednego Setter elementu w celu ustawienia innych właściwości obiektu, w którym zastosowano styl lub szablon.

Jeśli warunek "if" wyzwalacza właściwości ma szeroką gamę możliwych wartości, zaleca się ustawienie tej samej wartości właściwości na wartość domyślną przy użyciu Setter wyzwalacza zewnętrznego. W ten sposób element ustawiający w wyzwalaczu będzie miał pierwszeństwo, gdy warunek wyzwalacza to true, w przeciwnym razie Setter poza wyzwalaczem będzie pierwszeństwo.

Wyzwalacze właściwości są przydatne 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 elemecie.

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

Zobacz też