Właściwości zależności tylko do odczytuRead-Only Dependency Properties

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.This topic describes read-only dependency properties, including existing read-only dependency properties and the scenarios and techniques for creating a custom read-only dependency property.

Wymagania wstępnePrerequisites

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.This topic assumes that you understand the basic scenarios of implementing a dependency property, and how metadata is applied to a custom dependency property. Zapoznaj się z właściwościami zależności niestandardowych i metadanych właściwości zależności dla kontekstu.See Custom Dependency Properties and Dependency Property Metadata for context.

Istniejące właściwości zależności tylko do odczytuExisting Read-Only Dependency Properties

Niektóre właściwości zależności zdefiniowane w strukturze Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) są tylko do odczytu.Some of the dependency properties defined in the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) framework are read-only. Typowym powodem określania właściwości zależności tylko do odczytu są te właściwości, które powinny być używane do określania stanu, ale w których ten stan ma wpływ wiele czynników, ale po prostu ustawienie właściwości na ten stan nie jest pożądane z perspektywa projektowania interfejsu użytkownika.The typical reason for specifying a read-only dependency property is that these are properties that should be used for state determination, but where that state is influenced by a multitude of factors, but just setting the property to that state isn't desirable from a user interface design perspective. Na przykład właściwość IsMouseOver jest naprawdę tylko umieszczana w stanie określonym na podstawie danych wejściowych myszy.For example, the property IsMouseOver is really just surfacing state as determined from the mouse input. Każda próba ustawienia tej wartości programowo poprzez obejście rzeczywistego wejścia myszy byłoby nieprzewidywalne i spowoduje niespójność.Any attempt to set this value programmatically by circumventing the true mouse input would be unpredictable and would cause inconsistency.

Z uwagi na to, że 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 zazwyczaj oferują rozwiązanie (mianowicie: powiązanie danych, bezpośrednio określonych stylach do wartości, walidacji, animacji, dziedziczenia).By virtue of not being settable, read-only dependency properties aren't appropriate for many of the scenarios for which dependency properties normally offer a solution (namely: data binding, directly stylable to a value, validation, animation, inheritance). Mimo że właściwości zależności tylko do odczytu nie są jeszcze zdefiniowane, istnieją pewne dodatkowe możliwości obsługiwane przez właściwości zależności w systemie właściwości.Despite not being settable, read-only dependency properties still have some of the additional capabilities supported by dependency properties in the property system. Najważniejszym pozostałą możliwością jest, że właściwość zależności tylko do odczytu może nadal służyć jako wyzwalacz właściwości w stylu.The most important remaining capability is that the read-only dependency property can still be used as a property trigger in a style. Wyzwalaczy nie można włączyć za pomocą normalnej właściwości środowiska uruchomieniowego języka wspólnego (CLR); musi to być właściwość zależności.You can't enable triggers with a normal common language runtime (CLR) property; it needs to be a dependency property. Wcześniej IsMouseOver właściwość jest idealnym przykładem scenariusza, w którym może być przydatne Definiowanie stylu kontrolki, gdzie niektóre widoczne właściwości, takie jak tło, pierwszy plan lub podobne właściwości elementów złożonych w formancie, będą należy zmienić, gdy użytkownik umieści wskaźnik myszy nad określonym regionem kontrolki.The aforementioned IsMouseOver property is a perfect example of a scenario where it might be quite useful to define a style for a control, where some visible property such as a background, foreground, or similar properties of composited elements within the control will change when the user places a mouse over some defined region of your control. Zmiany w właściwości zależności tylko do odczytu mogą być również wykrywane i raportowane przez niewłaściwe procesy unieważniania systemu właściwości, a to w rzeczywistości obsługuje wewnętrznie funkcje wyzwalacza właściwości.Changes in a read-only dependency property can also be detected and reported by the property system's inherent invalidation processes, and this in fact supports the property trigger functionality internally.

Tworzenie niestandardowych właściwości zależności tylko do odczytuCreating Custom Read-Only Dependency Properties

Upewnij się, że zapoznaj się z sekcją powyżej, dlaczego właściwości zależności tylko do odczytu nie będą działały dla wielu typowych scenariuszy właściwości zależności.Make sure to read the section above regarding why read-only dependency properties won't work for many typical dependency-property scenarios. Jeśli jednak masz odpowiedni scenariusz, możesz utworzyć własną właściwość zależności tylko do odczytu.But if you have an appropriate scenario, you may wish to create your own read-only dependency property.

Większość procesu tworzenia właściwości zależności tylko do odczytu jest taka sama jak opisana we właściwościach zależności niestandardowych i Zaimplementuj tematy dotyczące właściwości zależności .Much of the process of creating a read-only dependency property is the same as is described in the Custom Dependency Properties and Implement a Dependency Property topics. Istnieją trzy istotne różnice:There are three important differences:

  • Podczas rejestrowania właściwości Wywołaj metodę RegisterReadOnly zamiast normalnej metody Register do rejestracji właściwości.When registering your property, call the RegisterReadOnly method instead of the normal Register method for property registration.

  • Podczas implementowania właściwości CLR "otoka" Upewnij się, że otoka nie ma ustawionej implementacji, więc nie istnieje niespójność w stanie tylko do odczytu dla otoki publicznej, którą ujawniasz.When implementing the CLR "wrapper" property, make sure that the wrapper too doesn't have a set implementation, so that there is no inconsistency in read-only state for the public wrapper you expose.

  • Obiekt zwrócony przez rejestrację tylko do odczytu jest DependencyPropertyKey, a nie DependencyProperty.The object returned by the read-only registration is DependencyPropertyKey rather than DependencyProperty. To pole powinno być nadal przechowywane jako element członkowski, ale zazwyczaj nie można go utworzyć jako publicznego elementu członkowskiego typu.You should still store this field as a member but typically you would not make it a public member of the type.

Niezależnie od tego, jakie pole lub wartość jest używana do tworzenia kopii zapasowej właściwości zależności tylko do odczytu, może być w pełni zapisywalne przy użyciu dowolnej logiki.Whatever private field or value you have backing your read-only dependency property can of course be fully writable using whatever logic you decide. Jednak najbardziej bezpośrednim 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, zamiast omijania systemu właściwości i bezpośredniego ustawiania prywatnego pola zapasowego.However, the most straightforward way to set the property either initially or as part of runtime logic is to use the property system's APIs, rather than circumventing the property system and setting the private backing field directly. W szczególności istnieje sygnatura SetValue, która akceptuje parametr typu DependencyPropertyKey.In particular, there is a signature of SetValue that accepts a parameter of type DependencyPropertyKey. Jak i miejsce, w którym ta wartość jest ustawiana programowo w ramach logiki aplikacji, będzie mieć wpływ na sposób, w jaki użytkownik może chcieć ustawić dostęp do DependencyPropertyKey utworzonego podczas pierwszej rejestracji właściwości zależności.How and where you set this value programmatically within your application logic will affect how you may wish to set access on the DependencyPropertyKey created when you first registered the dependency property. Jeśli ta logika jest obsługiwana w ramach klasy, można ją ustawić jako prywatną lub jeśli wymaga jej ustawienia z innych części zestawu, można ustawić ją jako wewnętrzną.If you handle this logic all within the class you could make it private, or if you require it to be set from other portions of the assembly you might set it internal. Jednym z metod jest wywołanie SetValue w ramach procedury obsługi zdarzeń klasy odpowiedniego zdarzenia, które informuje wystąpienie klasy o konieczności zmiany przechowywanej wartości właściwości.One approach is to call SetValue within a class event handler of a relevant event that informs a class instance that the stored property value needs to be changed. Innym podejściem jest powiązanie właściwości zależności przy użyciu sparowanych PropertyChangedCallback i CoerceValueCallback wywołań zwrotnych w ramach metadanych podczas rejestracji.Another approach is to tie dependency properties together by using paired PropertyChangedCallback and CoerceValueCallback callbacks as part of those properties' metadata during registration.

Ponieważ DependencyPropertyKey jest prywatny i nie jest propagowany przez system właściwości poza kodem, właściwość zależności tylko do odczytu ma lepszą wartość zabezpieczenia niż właściwość zależności odczytu i zapisu.Because the DependencyPropertyKey is private, and is not propagated by the property system outside of your code, a read-only dependency property does have better setting security than a read-write dependency property. Dla właściwości zależności odczytu i zapisu pole identyfikacyjne jest jawnie lub niejawnie publiczne i w ten sposób właściwość jest szeroko settable.For a read-write dependency property, the identifying field is explicitly or implicitly public and thus the property is widely settable. Aby uzyskać bardziej szczegółowe informacje, zobacz zależność właściwości zależności.For more specifics, see Dependency Property Security.

Zobacz takżeSee also