Metadane zależności właściwości

System właściwości Windows Presentation Foundation (WPF) zawiera system raportowania metadanych, który wykracza poza to, co można zgłaszać na temat właściwości za pośrednictwem odbicia lub ogólnych cech środowiska uruchomieniowego języka wspólnego (CLR). Metadane właściwości zależności można również przypisać unikatowo przez klasę, która definiuje właściwość zależności, można zmienić, gdy właściwość zależności jest dodawana do innej klasy i może być w szczególności zastępowana przez wszystkie klasy pochodne, które dziedziczą właściwość zależności z definiującej klasę bazową.

Wymagania wstępne

W tym temacie założono, że rozumiesz właściwości zależności z perspektywy konsumenta istniejących właściwości zależności w klasach WPF i zapoznasz się z omówieniem właściwości zależności. Aby postępować zgodnie z przykładami w tym temacie, należy również zrozumieć język XAML i wiedzieć, jak pisać aplikacje WPF.

Jak są używane metadane właściwości zależności

Metadane właściwości zależności istnieją jako obiekt, którego można odpytować w celu zbadania cech właściwości zależności. Te metadane są również często używane przez system właściwości, ponieważ przetwarza on dowolną daną właściwość zależności. Obiekt metadanych dla właściwości zależności może zawierać następujące typy informacji:

  • Wartość domyślna właściwości zależności, jeśli żadna inna wartość nie może być określona dla właściwości zależności według wartości lokalnej, stylu, dziedziczenia itp. Aby zapoznać się z dokładnym omówieniem tego, jak wartości domyślne uczestniczą w pierwszeństwie używanym przez system właściwości właściwości podczas przypisywania wartości dla właściwości zależności, zobacz Pierwszeństwo wartości właściwości zależności.

  • Odwołania do implementacji wywołania zwrotnego, które mają wpływ na zachowanie wymuszania lub powiadamiania o zmianach w zależności od typu właściciela. Należy pamiętać, że te wywołania zwrotne są często definiowane z poziomu dostępu niepublikowanego, dlatego uzyskanie rzeczywistych odwołań z metadanych jest ogólnie niemożliwe, chyba że odwołania znajdują się w dozwolonym zakresie dostępu. Aby uzyskać więcej informacji na temat wywołań zwrotnych właściwości zależności, zobacz Wywołania zwrotne właściwości zależności i walidacja.

  • Jeśli właściwość zależności, o której mowa, jest uważana za właściwość na poziomie struktury WPF, metadane mogą zawierać właściwości właściwości zależności na poziomie struktury WPF, które zgłaszają informacje i stan dla usług, takich jak aparat układu na poziomie platformy WPF i logika dziedziczenia właściwości. Aby uzyskać więcej informacji na temat tego aspektu metadanych właściwości zależności, zobacz Metadane właściwości struktury.

Interfejsy API metadanych

Typ zgłaszający większość informacji o metadanych używanych przez system właściwości jest klasą PropertyMetadata . Wystąpienia metadanych są opcjonalnie określane, gdy właściwości zależności są zarejestrowane w systemie właściwości i można je ponownie określić dla dodatkowych typów, które dodają się jako właściciele lub przesłaniają metadane dziedziczone z definicji właściwości zależności klasy bazowej. (W przypadku, gdy rejestracja właściwości nie określa metadanych, wartość domyślna PropertyMetadata jest tworzona z wartościami domyślnymi dla tej klasy). Zarejestrowane metadane są zwracane tak, jak PropertyMetadata podczas wywoływania różnych GetMetadata przeciążeń, które pobierają metadane z właściwości zależności na wystąpieniu DependencyObject .

Klasa jest następnie pochodna PropertyMetadata , aby zapewnić bardziej szczegółowe metadane dla podziałów architektury, takich jak klasy na poziomie platformy WPF. UIPropertyMetadata dodaje raportowanie animacji i FrameworkPropertyMetadata udostępnia właściwości na poziomie platformy WPF wymienione w poprzedniej sekcji. Po zarejestrowaniu właściwości zależności można je zarejestrować przy użyciu tych PropertyMetadata klas pochodnych. Po zbadaniu metadanych typ podstawowy PropertyMetadata może być potencjalnie rzutowany do klas pochodnych, aby można było zbadać bardziej szczegółowe właściwości.

Uwaga

Właściwości, które można określić w pliku FrameworkPropertyMetadata , są czasami określane w tej dokumentacji jako "flagi". Podczas tworzenia nowych wystąpień metadanych do użycia w rejestracjach właściwości zależności lub przesłonięcia metadanych należy określić te wartości przy użyciu wyliczenia FrameworkPropertyMetadataOptions flagowego, a następnie podać ewentualnie łączone wartości wyliczenia do konstruktora FrameworkPropertyMetadata . Jednak po skonstruowaniu te cechy opcji są uwidocznione w postaci FrameworkPropertyMetadata serii właściwości logicznych, a nie wartości wyliczenia konstruowania. Właściwości logiczne umożliwiają sprawdzanie poszczególnych warunkowych, a nie wymaganie zastosowania maski do wartości wyliczenia flagowego w celu uzyskania interesujących Cię informacji. Konstruktor używa połączenia FrameworkPropertyMetadataOptions , aby zachować rozsądną długość podpisu konstruktora, podczas gdy rzeczywiste skonstruowane metadane uwidaczniają właściwości dyskretne w celu zwiększenia intuicyjności wykonywania zapytań dotyczących metadanych.

Kiedy zastąpić metadane, kiedy należy utworzyć klasę

System właściwości WPF ma ustalone możliwości zmiany niektórych cech właściwości zależności bez konieczności ich całkowitego ponownego zaimplementowania. Jest to realizowane przez utworzenie innego wystąpienia metadanych właściwości dla właściwości zależności, ponieważ istnieje w określonym typie. Należy pamiętać, że większość istniejących właściwości zależności nie jest właściwościami wirtualnymi, dlatego ściśle mówiąc "ponownie implementuje" je na dziedziczone klasy, można wykonać tylko przez cieniowanie istniejącego elementu członkowskiego.

Jeśli scenariusz, który próbujesz włączyć dla właściwości zależności dla typu, nie można osiągnąć przez zmodyfikowanie właściwości istniejących właściwości zależności, może być konieczne utworzenie klasy pochodnej, a następnie zadeklarowanie niestandardowej właściwości zależności dla klasy pochodnej. Niestandardowa właściwość zależności zachowuje się identycznie z właściwościami zależności zdefiniowanymi przez interfejsy API WPF. Aby uzyskać więcej informacji na temat niestandardowych właściwości zależności, zobacz Właściwości zależności niestandardowych.

Jedną z godnych uwagi cechą właściwości zależności, której nie można zastąpić, jest jego typ wartości. Jeśli dziedziczysz właściwość zależności, która ma przybliżone wymagane zachowanie, ale potrzebujesz innego typu, musisz zaimplementować niestandardową właściwość zależności i być może połączyć właściwości za pomocą konwersji typów lub innej implementacji w klasie niestandardowej. Ponadto nie można zastąpić istniejącego ValidateValueCallbackobiektu , ponieważ to wywołanie zwrotne istnieje w samym polu rejestracji, a nie w jego metadanych.

Scenariusze zmiany istniejących metadanych

Jeśli pracujesz z metadanymi istniejącej właściwości zależności, jednym z typowych scenariuszy zmiany metadanych właściwości zależności jest zmiana wartości domyślnej. Zmiana lub dodanie wywołań zwrotnych systemu właściwości jest bardziej zaawansowanym scenariuszem. Możesz to zrobić, jeśli implementacja klasy pochodnej ma różne powiązania między właściwościami zależności. Jednym z warunków posiadania modelu programowania obsługującego zarówno kod, jak i użycie deklaratywne jest to, że właściwości muszą być ustawione w dowolnej kolejności. W związku z tym wszelkie właściwości zależne muszą być ustawiane just-in-time bez kontekstu i nie mogą polegać na znajomości kolejności ustawień, takiej jak można znaleźć w konstruktorze. Aby uzyskać więcej informacji na temat tego aspektu systemu właściwości, zobacz Wywołania zwrotne właściwości zależności i walidacja. Należy pamiętać, że wywołania zwrotne weryfikacji nie są częścią metadanych; są częścią identyfikatora właściwości zależności. W związku z tym wywołania zwrotne weryfikacji nie mogą zostać zmienione przez zastąpienie metadanych.

W niektórych przypadkach można również zmienić opcje metadanych właściwości na poziomie platformy WPF na istniejących właściwościach zależności. Te opcje komunikują pewne znane warunkowe właściwości na poziomie struktury WPF do innych procesów na poziomie struktury WPF, takich jak system układu. Ustawienie opcji jest zwykle wykonywane tylko podczas rejestrowania nowej właściwości zależności, ale istnieje również możliwość zmiany metadanych właściwości na poziomie struktury WPF w ramach OverrideMetadata wywołania lub AddOwner . Aby uzyskać szczegółowe wartości do użycia i więcej informacji, zobacz Metadane właściwości struktury. Aby uzyskać więcej informacji dotyczących sposobu ustawiania tych opcji dla nowo zarejestrowanej właściwości zależności, zobacz Właściwości zależności niestandardowych.

Zastępowanie metadanych

Celem zastępowania metadanych jest przede wszystkim możliwość zmiany różnych zachowań pochodnych metadanych, które są stosowane do właściwości zależności, ponieważ istnieje w twoim typie. Przyczyny tego problemu wyjaśniono bardziej szczegółowo w sekcji Metadane . Aby uzyskać więcej informacji, w tym kilka przykładów kodu, zobacz Zastępowanie metadanych właściwości zależności.

Metadane właściwości można podać dla właściwości zależności podczas wywołania rejestracji (Register). Jednak w wielu przypadkach można podać metadane specyficzne dla typu dla klasy, gdy dziedziczy tę właściwość zależności. Można to zrobić, wywołując metodę OverrideMetadata . Na przykład z interfejsów API WPF klasa jest typem, FrameworkElement który najpierw rejestruje Focusable właściwość zależności. Control Jednak klasa zastępuje metadane właściwości zależności, aby zapewnić własną początkową wartość domyślną, zmieniając ją z false na true, a w przeciwnym razie ponownie używa oryginalnej Focusable implementacji.

Po zastąpieniu metadanych różne cechy metadanych są scalane lub zastępowane.

  • PropertyChangedCallback jest scalony. Jeśli dodasz nowy PropertyChangedCallbackelement , wywołanie zwrotne jest przechowywane w metadanych. Jeśli nie określisz PropertyChangedCallback wartości w przesłonięć, wartość PropertyChangedCallback jest promowana jako odwołanie z najbliższego obiektu nadrzędnego, który określił go w metadanych.

  • Rzeczywiste zachowanie PropertyChangedCallback systemu właściwości polega na tym, że implementacje dla wszystkich właścicieli metadanych w hierarchii są zachowywane i dodawane do tabeli, z kolejnością wykonywania przez system właściwości jest to, że wywołania zwrotne najbardziej pochodnej klasy są wywoływane jako pierwsze.

  • DefaultValue element jest zastępowany. Jeśli nie określisz DefaultValue wartości w przesłonięć, wartość DefaultValue pochodzi z najbliższego obiektu nadrzędnego, który określił go w metadanych.

  • CoerceValueCallback implementacje są zastępowane. Jeśli dodasz nowy CoerceValueCallbackelement , wywołanie zwrotne jest przechowywane w metadanych. Jeśli nie określisz CoerceValueCallback wartości w przesłonięć, wartość CoerceValueCallback jest promowana jako odwołanie z najbliższego obiektu nadrzędnego, który określił go w metadanych.

  • Zachowanie systemu właściwości polega na tym, że wywoływane są tylko CoerceValueCallback metadane bezpośrednie. Nie są zachowywane żadne odwołania do innych CoerceValueCallback implementacji w hierarchii.

To zachowanie jest implementowane przez Mergeprogram i może zostać zastąpione w klasach pochodnych metadanych.

Zastępowanie metadanych dołączonych właściwości

W WPF dołączone właściwości są implementowane jako właściwości zależności. Oznacza to, że mają również metadane właściwości, które poszczególne klasy mogą zastąpić. Zagadnienia określające zakres dotyczące dołączonej właściwości w WPF są na ogół możliwe, że każda DependencyObject właściwość może mieć ustawioną właściwość dołączoną. W związku z tym każda DependencyObject klasa pochodna może zastąpić metadane dla dowolnej dołączonej właściwości, ponieważ może być ustawiona na wystąpieniu klasy. Można zastąpić wartości domyślne, wywołania zwrotne lub właściwości raportowania cech na poziomie struktury WPF. Jeśli dołączona właściwość jest ustawiona na wystąpieniu klasy, mają zastosowanie te właściwości metadanych przesłonięcia. Można na przykład zastąpić wartość domyślną, tak aby wartość przesłonięcia była zgłaszana jako wartość dołączonej właściwości w wystąpieniach klasy, gdy właściwość nie jest ustawiona w inny sposób.

Uwaga

Właściwość Inherits nie jest odpowiednia dla dołączonych właściwości.

Dodawanie klasy jako właściciela istniejącej właściwości zależności

Klasa może dodać się jako właściciel właściwości zależności, która została już zarejestrowana przy użyciu AddOwner metody . Dzięki temu klasa może używać właściwości zależności, która została pierwotnie zarejestrowana dla innego typu. Klasa dodawania zazwyczaj nie jest klasą pochodną typu, który po raz pierwszy zarejestrował właściwość zależności jako właściciel. Dzięki temu klasa i jej klasy pochodne mogą "dziedziczyć" implementację właściwości zależności bez oryginalnej klasy właściciela i dodając klasę będącą w tej samej prawdziwej hierarchii klas. Ponadto dodanie klasy (i wszystkich klas pochodnych) może następnie dostarczyć metadane specyficzne dla typu dla oryginalnej właściwości zależności.

Oprócz dodawania siebie jako właściciela za pomocą metod narzędzi systemu właściwości, klasa dodawania powinna zadeklarować dodatkowe publiczne elementy członkowskie na siebie, aby właściwość zależności] był pełnym uczestnikiem systemu właściwości z ekspozycją zarówno na kod, jak i znaczniki. Klasa, która dodaje istniejącą właściwość zależności, ma takie same obowiązki jak uwidacznianie modelu obiektów dla tej właściwości zależności, podobnie jak klasa, która definiuje nową niestandardową właściwość zależności. Pierwszy taki element członkowski do uwidocznienia to pole identyfikatora właściwości zależności. To pole powinno być polem public static readonly typu DependencyProperty, które jest przypisane do zwracanej wartości wywołania AddOwner . Drugim elementem do zdefiniowania jest właściwość środowiska uruchomieniowego języka wspólnego (CLR) "otoka". Otoka sprawia, że znacznie wygodniejsze jest manipulowanie właściwością zależności w kodzie (unika się wywołań SetValue za każdym razem i może wykonywać to wywołanie tylko raz w samej otoce). Otoka jest implementowana identycznie, jak można by ją zaimplementować, jeśli rejestrujesz niestandardową właściwość zależności. Aby uzyskać więcej informacji na temat implementowania właściwości zależności, zobacz Właściwości zależności niestandardowych i Dodawanie typu właściciela dla właściwości zależności.

Właściwości addOwner i dołączone

Można wywołać AddOwner właściwość zależności, która jest zdefiniowana jako dołączona właściwość klasy właściciela. Ogólnie rzecz biorąc, przyczyną tego jest uwidocznienie wcześniej dołączonej właściwości jako właściwości zależności, która nie jest dołączona. Następnie uwidocznisz AddOwner wartość zwracaną public static readonly jako pole do użycia jako identyfikator właściwości zależności i zdefiniujesz odpowiednie właściwości "otoki", tak aby właściwość pojawiała się w tabeli elementów członkowskich i obsługuje użycie właściwości nieprzyłączonych w klasie.

Zobacz też