Metadane właściwości zależności (WPF .NET)
System właściwości Windows Presentation Foundation (WPF) zawiera system raportowania metadanych właściwości zależności. Informacje dostępne w systemie raportowania metadanych przekraczają to, co jest dostępne za pośrednictwem odbicia lub ogólnych cech środowiska uruchomieniowego języka wspólnego (CLR). Podczas rejestrowania właściwości zależności możesz utworzyć i przypisać do niej metadane. Jeśli pochodzisz z klasy, która definiuje właściwość zależności, możesz zastąpić metadane dla dziedziczonej właściwości zależności. Jeśli dodasz swoją klasę jako właściciela właściwości zależnej, możesz zastąpić metadane dziedziczonej właściwości zależnej.
Warunki wstępne
Artykuł zakłada, że masz podstawową wiedzę na temat właściwości zależności oraz że przeczytałeś omówienie właściwości zależności . Aby postępować zgodnie z przykładami w tym artykule, warto zapoznać się z językiem Extensible Application Markup Language (XAML) i wiedzieć, jak pisać aplikacje WPF.
Jak są używane metadane
Możesz wykonać zapytanie o metadane właściwości zależności, aby zbadać cechy właściwości zależności. Gdy system właściwości przetwarza właściwość zależności, uzyskuje dostęp do metadanych. Obiekt metadanych dla właściwości zależności zawiera następujące typy informacji:
Wartość domyślna właściwości zależności, która jest ustawiana przez system właściwości, gdy żadna inna wartość nie ma zastosowania, na przykład lokalna, styl lub wartość dziedziczenia. Aby uzyskać więcej informacji o pierwszeństwie wartości w czasie wykonywania przypisania wartości do właściwości zależności, zobacz Pierwszeństwo właściwości zależności.
Odwołania do wywołań zwrotnych przekształcania wartości i zmiany właściwości w typie właściciela. Można uzyskać referencje tylko do wywołań zwrotnych, które mają modyfikator dostępu
public
lub znajdują się w dozwolonym zakresie dostępu. Aby uzyskać więcej informacji na temat wywołań zwrotnych i walidacji właściwości zależności, zobacz wywołania zwrotne właściwości zależności i walidacja.Właściwości zależności na poziomie platformy WPF (jeśli właściwość zależności jest właściwością struktury WPF). Procesy WPF, takie jak aparat układu struktury i logika dziedziczenia właściwości, wysyłają zapytania do metadanych na poziomie struktury WPF. Aby uzyskać więcej informacji, zobacz Framework property metadata.
API metadanych
Klasa PropertyMetadata przechowuje większość metadanych używanych przez system właściwości. Wystąpienia metadanych można tworzyć i przypisywać przez:
Typy rejestrujące właściwości zależności w systemie właściwości.
Typy dziedziczone z klasy definiującej właściwość zależności.
Typy, które dodają siebie jako właściciela właściwości zależności.
Jeśli typ rejestruje właściwość zależności bez określania metadanych, system właściwości przypisuje obiekt PropertyMetadata
z wartościami domyślnymi dla tego typu do właściwości zależności.
Aby pobrać metadane dla właściwości zależności, wywołaj jedno z przeciążeń GetMetadata na identyfikatorze DependencyProperty. Metadane są zwracane jako obiekt PropertyMetadata
.
Bardziej szczegółowe klasy metadanych pochodzące z PropertyMetadata
istnieją dla różnych obszarów architektury. Na przykład UIPropertyMetadata obsługuje raportowanie animacji, a FrameworkPropertyMetadata obsługuje właściwości struktury WPF. Właściwości zależności można również zarejestrować przy użyciu klas pochodnych PropertyMetadata
. Mimo że GetMetadata
zwraca obiekt PropertyMetadata
, jeśli ma to zastosowanie, można rzutować do typu pochodnego w celu zbadania właściwości specyficznych dla typu.
Właściwości uwidocznione przez FrameworkPropertyMetadata
są czasami nazywane flagami . Podczas tworzenia wystąpienia FrameworkPropertyMetadata
można przekazać wystąpienie typu wyliczenia FrameworkPropertyMetadataOptions do konstruktora FrameworkPropertyMetadata
.
FrameworkPropertyMetadataOptions
umożliwia określenie flag metadanych w kombinacji bitowej.
FrameworkPropertyMetadata
używa FrameworkPropertyMetadataOptions
, aby zachować długość podpisu konstruktora rozsądną. W przypadku rejestracji właściwości zależności, flagi metadanych, które ustawiasz na FrameworkPropertyMetadataOptions
, są uwidocznione w FrameworkPropertyMetadata
jako właściwości Boolean
, a nie jako bitowa kombinacja flag. Dzięki temu zapytania dotyczące właściwości metadanych są bardziej intuicyjne.
Czy zastąpić czy utworzyć nowe metadane?
Gdy dziedziczysz właściwość zależności, możesz zmienić jej atrybuty poprzez nadpisanie jej metadanych. Jednak nie zawsze możesz być w stanie zrealizować Twojego scenariusza właściwości zależności poprzez zastąpienie metadanych, a czasami konieczne jest zdefiniowanie niestandardowej właściwości zależności w Twojej klasie z nowymi metadanymi. Właściwości zależności niestandardowych mają takie same możliwości jak właściwości zależności zdefiniowane przez typy WPF. Aby uzyskać więcej informacji, zobacz Właściwości zależności niestandardowych.
Jedną z cech właściwości zależności, której nie można zastąpić, jest jego typ wartości. Jeśli dziedziczona właściwość zależności ma przybliżone zachowanie, ale scenariusz wymaga innego typu wartości, rozważ zaimplementowanie niestandardowej właściwości zależności. Możliwe, że uda ci się połączyć wartości właściwości za pomocą konwersji typów lub innej implementacji w swojej klasie pochodnej.
Scenariusze zastępowania metadanych
Przykładowe scenariusze zastępowania istniejących metadanych właściwości zależności to:
Zmiana wartości domyślnej, która jest typowym scenariuszem.
Zmiana lub dodanie wywołań zwrotnych zmiany właściwości, co może być konieczne, jeśli dziedziczona właściwość zależności współdziała z innymi właściwościami zależności inaczej niż implementacja podstawowa. Jedną z cech modelu programowania, który obsługuje zarówno kod, jak i znacznik, jest to, że wartości właściwości mogą być ustawiane w dowolnej kolejności. Ten czynnik może mieć wpływ na sposób implementowania wywołań zwrotnych zmiany właściwości. Aby uzyskać więcej informacji, zobacz wywołania zwrotne i walidację właściwości zależności.
Zmiana opcji metadanych właściwości ramy WPF . Zazwyczaj opcje metadanych są ustawiane podczas rejestracji nowej właściwości zależności, ale można je zmienić w wywołaniach OverrideMetadata lub AddOwner. Aby uzyskać więcej informacji na temat zastępowania metadanych właściwości struktury, zobacz Określanie FrameworkPropertyMetadata. Aby dowiedzieć się, jak ustawić opcje metadanych właściwości struktury podczas rejestrowania właściwości zależności, zobacz Niestandardowe właściwości zależności.
Notatka
Ponieważ wywołania zwrotne weryfikacji nie są częścią metadanych, nie można ich zmienić przez zastępowanie metadanych. Aby uzyskać więcej informacji, zobacz wywołania zwrotne wartości walidacji.
Zastępowanie metadanych
Podczas implementowania nowej właściwości zależności można ustawić jej metadane przy użyciu przeciążeń metody Register. Jeśli klasa dziedziczy właściwość zależności, można zastąpić dziedziczone wartości metadanych przy użyciu metody OverrideMetadata. Na przykład możesz użyć OverrideMetadata
, aby ustawić wartości specyficzne dla typu. Aby uzyskać więcej informacji i przykładów kodu, zobacz Przesłanianie metadanych dla właściwości zależności.
Przykładem właściwości zależności WPF jest Focusable. Klasa FrameworkElement rejestruje Focusable
. Klasa Control pochodzi z FrameworkElement
, dziedziczy właściwość zależności Focusable
i zastępuje dziedziczone metadane właściwości. Nadpisanie zmienia domyślną wartość właściwości z false
na true
, ale zachowuje inne dziedziczone wartości metadanych.
Ponieważ większość istniejących właściwości zależności nie jest właściwościami wirtualnymi, ich dziedziczona implementacja przesłania istniejącego członka. Gdy zastępujesz właściwość metadanych, nowa wartość metadanych albo zastępuje oryginalną wartość, albo obie wartości są scalane.
W przypadku DefaultValuenowa wartość zastąpi istniejącą wartość domyślną. Jeśli nie określisz
DefaultValue
w metadanych przesłonięcia, wartość pochodzi z najbliższego obiektu nadrzędnego, w którego metadanych określonoDefaultValue
.W przypadku PropertyChangedCallbackdomyślna logika scalania przechowuje wszystkie
PropertyChangedCallback
wartości w tabeli, a wszystkie są wywoływane przy zmianie właściwości. Kolejność wywołania zwrotnego jest określana przez poziom klasy, tak że wywołanie zwrotne zarejestrowane przez klasę bazową w hierarchii będzie wykonywane jako pierwsze.W przypadku CoerceValueCallbacknowa wartość zastąpi istniejącą wartość
CoerceValueCallback
. Jeśli nie określiszCoerceValueCallback
w metadanych zastąpienia, wartość pochodzi z najbliższego przodka, który określałCoerceValueCallback
w metadanych.
Notatka
Domyślna logika scalania jest implementowana przez metodę Merge. Niestandardową logikę scalania można określić w klasie pochodnej, która dziedziczy właściwość zależności, przesłaniając Merge
w tej klasie.
Dodaj klasę jako właściciel
Aby "dziedziczyć" właściwość zależności zarejestrowaną w innej hierarchii klas, użyj metody AddOwner. Ta metoda jest zwykle używana, gdy klasa dodawania nie pochodzi z typu, który zarejestrował właściwość zależności. W wywołaniu AddOwner
dodająca klasa może tworzyć i przypisywać metadane specyficzne dla typu dziedziczonej właściwości zależności. Aby być pełnoprawnym uczestnikiem systemu właściwości, klasa dodająca powinna za pomocą kodu i znaczników implementować następujące publiczne elementy członkowskie:
Pole identyfikatora właściwości zależności. Wartość identyfikatora właściwości zależności jest wartością zwracaną wywołania
AddOwner
. To pole powinno być polempublic static readonly
typu DependencyProperty.Powłoka CLR, która implementuje akcesory
get
iset
. Korzystając z otoki właściwości, użytkownicy właściwości zależności mogą pobierać lub ustawiać wartości tych właściwości, tak samo jak każdą inną właściwość CLR. Metody dostępuget
iset
współdziałają z podstawowym systemem właściwości za pośrednictwem wywołań DependencyObject.GetValue i DependencyObject.SetValue, przekazując identyfikator właściwości zależności jako parametr. Zaimplementuj wrapper podobnie jak przy rejestrowaniu własnej właściwości zależności. Aby uzyskać więcej informacji, zobacz Właściwości zależności niestandardowych
Klasa, która wywołuje AddOwner
ma te same wymagania dotyczące uwidaczniania modelu obiektów właściwości zależności dziedziczonej jako klasy definiującej nową niestandardową właściwość zależności. Aby uzyskać więcej informacji, zobacz Dodaj typ właściciela do właściwości zależności.
Metadane dołączonej właściwości
W WPF większość dołączonych właściwości interfejsu użytkownika w typach WPF jest implementowana jako właściwości zależne. Dołączone właściwości zaimplementowane jako właściwości zależności obsługują koncepcje właściwości zależności, takie jak metadane, które klasy pochodne mogą zastąpić. Metadane dołączonej właściwości zwykle nie różnią się od właściwości zależności. Można zastąpić wartość domyślną, wywołania zwrotne zmiany właściwości oraz właściwości ramy WPF dla dziedziczonej właściwości dołączonej w przypadkach klas dokonujących zastąpienia. Aby uzyskać więcej informacji, zobacz Dołączone metadane właściwości
Notatka
Zawsze używaj RegisterAttached do rejestrowania właściwości, gdy w metadanych określisz Inherits. Mimo że dziedziczenie wartości właściwości może działać dla niezwiązanych właściwości zależności, zachowanie dziedziczenia wartości dla niezwiązanej właściwości w wyniku podziałów obiektów w drzewie w czasie wykonywania jest niezdefiniowane. Właściwość Inherits
nie jest istotna dla nieprzyłączonych właściwości. Aby uzyskać więcej informacji, zapoznaj się z RegisterAttached(String, Type, Type, PropertyMetadata)oraz sekcją "Uwagi" w Inherits.
Dodawanie klasy jako właściciela dołączonej właściwości
Aby dziedziczyć dołączoną właściwość z innej klasy, ale uwidaczniać ją jako nieprzyłączoną właściwość zależności dla klasy:
Wywołaj AddOwner, aby dodać swoją klasę jako właściciela przypisanej właściwości zależności.
Przypisz wartość zwracaną wywołania
AddOwner
do polapublic static readonly
do użycia jako identyfikator właściwości zależności.Zdefiniuj wrapper CLR, który dodaje właściwość jako składową klasy i wspiera użycie właściwości niewiązanej.
Zobacz też
.NET Desktop feedback