Właściwości zależności tylko do odczytu

W tym temacie opisano właściwości zależności tylko do odczytu, w tym istniejące właściwości zależności tylko do odczytu oraz scenariusze i techniki tworzenia niestandardowej właściwości zależności tylko do odczytu.

Wymagania wstępne

W tym temacie założono, że rozumiesz podstawowe scenariusze implementowania właściwości zależności oraz sposób stosowania metadanych do niestandardowej właściwości zależności. Zobacz Niestandardowe właściwości zależności i metadane właściwości zależności, aby zapoznać się z kontekstem.

Istniejące właściwości zależności tylko do odczytu

Niektóre właściwości zależności zdefiniowane w strukturze Windows Presentation Foundation (WPF) są tylko do odczytu. Typową przyczyną określania właściwości zależności tylko do odczytu jest to, że są to właściwości, które powinny być używane do określania stanu, ale gdy ten stan ma wpływ na wiele czynników, ale po prostu ustawienie właściwości na ten stan nie jest pożądane z perspektywy projektu interfejsu użytkownika. Na przykład właściwość IsMouseOver jest naprawdę tylko stanem, który jest określany na podstawie danych wejściowych myszy. Każda próba programowego ustawienia tej wartości przez obejście prawdziwych danych wejściowych myszy byłaby nieprzewidywalna i spowodowałaby niespójność.

Z powodu braku ustawiania właściwości zależności tylko do odczytu nie są odpowiednie dla wielu scenariuszy, dla których właściwości zależności zwykle oferują rozwiązanie (a mianowicie: powiązanie danych, bezpośrednie ustawianie stylu wartości, walidacji, animacji, dziedziczenia). Pomimo braku ustawiania właściwości zależności tylko do odczytu nadal mają niektóre dodatkowe możliwości obsługiwane przez właściwości zależności w systemie właściwości. Najważniejszą z pozostałych możliwości jest to, że właściwość zależności tylko do odczytu może być nadal używana jako wyzwalacz właściwości w stylu. Nie można włączyć wyzwalaczy z normalną właściwością środowiska uruchomieniowego języka wspólnego (CLR); musi być właściwością zależności. Wyżej wymieniona IsMouseOver właściwość jest doskonałym przykładem scenariusza, w którym może być całkiem przydatne zdefiniowanie stylu kontrolki, gdzie niektóre widoczne właściwości, takie jak tło, pierwszy plan lub podobne właściwości złożonych elementów w kontrolce, zmienią się, gdy użytkownik umieści wskaźnik myszy nad określonym regionem kontrolki. Zmiany właściwości zależności tylko do odczytu można również wykrywać i zgłaszać przez nieodłączne procesy unieważniania systemu właściwości, a w rzeczywistości obsługuje funkcję wyzwalacza właściwości wewnętrznie.

Tworzenie niestandardowych właściwości zależności tylko do odczytu

Pamiętaj, aby przeczytać sekcję powyżej dotyczącą tego, dlaczego właściwości zależności tylko do odczytu nie będą działać w przypadku wielu typowych scenariuszy właściwości zależności. Jeśli jednak masz odpowiedni scenariusz, możesz utworzyć własną właściwość zależności tylko do odczytu.

Większość procesu tworzenia właściwości zależności tylko do odczytu jest taka sama, jak opisano w tematach Właściwości zależności niestandardowych i Implementowanie właściwości zależności. Istnieją trzy ważne różnice:

  • Podczas rejestrowania właściwości wywołaj metodę RegisterReadOnly zamiast normalnej Register metody rejestracji właściwości.

  • Podczas implementowania właściwości "otoka" środowiska CLR upewnij się, że otoka również nie ma ustawionej implementacji, aby nie było niespójności w stanie tylko do odczytu dla uwidocznionego publicznego otoki.

  • Obiekt zwracany przez rejestrację tylko do odczytu jest DependencyPropertyKey zamiast DependencyProperty. To pole należy nadal przechowywać jako element członkowski, ale zazwyczaj nie będzie ono publicznym elementem członkowskim typu.

Niezależnie od tego, jakie pole prywatne lub wartość masz na potrzeby tworzenia kopii zapasowej właściwości zależności tylko do odczytu, można oczywiście w pełni zapisywać przy użyciu dowolnej wybranej logiki. Jednak najprostszym sposobem ustawienia właściwości początkowo lub w ramach logiki środowiska uruchomieniowego jest użycie interfejsów API systemu właściwości, a nie obejście systemu właściwości i bezpośrednie ustawienie prywatnego pola zapasowego. W szczególności istnieje podpis SetValue , który akceptuje parametr typu DependencyPropertyKey. Sposób i miejsce, w jaki ustawisz tę wartość programowo w ramach logiki aplikacji, będzie miało wpływ na sposób ustawiania dostępu do utworzonego DependencyPropertyKey podczas pierwszego zarejestrowania właściwości zależności. Jeśli obsłużysz tę logikę w całej klasie, możesz ustawić ją jako prywatną lub jeśli wymagasz jej ustawienia z innych części zestawu, możesz ustawić ją wewnętrzną. Jedną z metod jest wywołanie SetValue programu obsługi zdarzeń klasy odpowiedniego zdarzenia, które informuje wystąpienie klasy o konieczności zmiany wartości przechowywanej właściwości. Innym podejściem jest powiązanie właściwości zależności ze sobą przy użyciu sparowanych PropertyChangedCallback i CoerceValueCallback wywołań zwrotnych w ramach metadanych tych właściwości podczas rejestracji.

Ponieważ właściwość DependencyPropertyKey jest prywatna i nie jest propagowana przez system właściwości poza kodem, właściwość zależności tylko do odczytu ma lepsze ustawienie zabezpieczeń niż właściwość zależności odczytu i zapisu. W przypadku właściwości zależności read-write pole identyfikacji jest jawnie lub niejawnie publiczne, a tym samym właściwość jest szeroko ustawiana. Aby uzyskać bardziej szczegółowe informacje, zobacz Zabezpieczenia właściwości zależności.

Zobacz też