Udostępnij za pośrednictwem


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 PropertyMetadataistnieją 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ślono DefaultValue.

  • 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ślisz CoerceValueCallback 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ć polem public static readonly typu DependencyProperty.

  • Powłoka CLR, która implementuje akcesory get i set. 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ępu get i set 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 pola public 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ż