Metadata vlastností závislosti

Systém vlastností WINDOWS Presentation Foundation (WPF) obsahuje systém generování sestav metadat, který přesahuje to, co lze o vlastnosti ohlásit prostřednictvím reflexe nebo obecných charakteristik modulu CLR (Common Language Runtime). Metadata pro vlastnost závislosti lze také přiřadit jedinečně třídou, která definuje vlastnost závislosti, lze změnit, když je vlastnost závislosti přidána do jiné třídy a může být přepsána všemi odvozenými třídami, které dědí vlastnost závislosti z definování základní třídy.

Předpoklady

Toto téma předpokládá, že rozumíte vlastnostem závislostí z pohledu příjemce existujících vlastností závislostí na třídách WPF a přečetli si přehled vlastností závislosti. Abyste mohli postupovat podle příkladů v tomto tématu, měli byste také pochopit XAML a vědět, jak psát aplikace WPF.

Jak se používají metadata vlastností závislosti

Metadata vlastností závislostí existují jako objekt, který lze dotazovat na vlastnosti závislosti. Tato metadata jsou také často přístupná systémem vlastností, protože zpracovává jakoukoli danou vlastnost závislosti. Objekt metadat pro vlastnost závislosti může obsahovat následující typy informací:

  • Výchozí hodnota vlastnosti závislosti, pokud nelze pro vlastnost závislosti určit žádnou jinou hodnotu místní hodnotou, stylem, dědičností atd. Důkladnou diskuzi o tom, jak se výchozí hodnoty účastní přednosti používané systémem vlastností při přiřazování hodnot pro vlastnosti závislosti, naleznete v tématu Priorita hodnoty vlastnosti závislosti.

  • Odkazy na implementace zpětného volání, které ovlivňují chování převodu nebo oznámení změn na základě typu vlastníka. Mějte na paměti, že tyto zpětná volání jsou často definována s nepublikovanou úrovní přístupu, takže získání skutečných odkazů z metadat není obecně možné, pokud nejsou odkazy v rámci vašeho povoleného rozsahu přístupu. Další informace o zpětných voláních vlastností závislostí naleznete v tématu Zpětné volání vlastností závislostí a ověřování.

  • Pokud je dotčená vlastnost závislosti považována za vlastnost na úrovni architektury WPF, metadata můžou obsahovat vlastnosti vlastností závislostí na úrovni architektury WPF, které hlásí informace a stav pro služby, jako je modul rozložení na úrovni architektury WPF a logika dědičnosti vlastností. Další informace o tomto aspektu metadat vlastností závislostí naleznete v tématu Metadata vlastností rozhraní.

Rozhraní API metadat

Typ, který hlásí většinu informací metadat používaných systémem vlastností, je PropertyMetadata třída. Instance metadat jsou volitelně zadány při registraci vlastností závislostí v systému vlastností a lze je znovu zadat pro další typy, které buď přidávají jako vlastníci, nebo přepisují metadata, která dědí z definice vlastnosti závislosti základní třídy. (V případech, kdy registrace vlastnosti neurčuje metadata, se vytvoří výchozí PropertyMetadata hodnota s výchozími hodnotami pro danou třídu.) Registrovaná metadata se vrátí, jako PropertyMetadata když voláte různá GetMetadata přetížení, která získávají metadata z vlastnosti závislosti na DependencyObject instanci.

Třída PropertyMetadata se pak odvozuje od poskytnutí konkrétnějších metadat pro dělení architektury, jako jsou třídy architektury WPF na úrovni architektury. UIPropertyMetadata přidá sestavy animací a FrameworkPropertyMetadata poskytuje vlastnosti na úrovni architektury WPF uvedené v předchozí části. Při registraci vlastností závislostí je možné je zaregistrovat pomocí těchto PropertyMetadata odvozených tříd. Při zkoumání metadat lze základní PropertyMetadata typ potenciálně přetypovat na odvozené třídy, abyste mohli prozkoumat konkrétnější vlastnosti.

Poznámka:

Vlastnosti vlastností, které lze zadat v FrameworkPropertyMetadata této dokumentaci, se někdy označují jako příznaky. Když vytvoříte nové instance metadat pro použití v registracích vlastností závislostí nebo přepsání metadat, zadáte tyto hodnoty pomocí výčtu FrameworkPropertyMetadataOptions příznaku a pak zadáte pravděpodobně zřetězené hodnoty výčtu konstruktoru FrameworkPropertyMetadata . Po vytvoření jsou však tyto vlastnosti možností zpřístupněny v rámci FrameworkPropertyMetadata řady logických vlastností místo vytváření hodnoty výčtu. Logické vlastnosti umožňují zkontrolovat každou podmínku, místo abyste museli použít masku na hodnotu výčtu příznaku, abyste získali informace, které vás zajímají. Konstruktor používá zřetězený FrameworkPropertyMetadataOptions objekt, aby zachoval přiměřenou délku podpisu konstruktoru, zatímco skutečná konstruovaná metadata zpřístupňuje diskrétní vlastnosti, aby byly dotazování metadat intuitivnější.

Kdy přepsat metadata, Kdy odvodit třídu

Systém vlastností WPF vytvořil možnosti pro změnu některých vlastností závislostí, aniž by bylo nutné je zcela znovu implementovat. Toho se dosahuje vytvořením jiné instance metadat vlastností pro vlastnost závislosti, protože existuje v určitém typu. Všimněte si, že většina existujících vlastností závislostí není virtuálními vlastnostmi, takže přísně řečeno je "znovu implementovat" u zděděných tříd lze provést pouze stínováním existujícího člena.

Pokud se scénář, který se pokoušíte povolit pro vlastnost závislosti na typu, nelze dosáhnout úpravou charakteristik existujících vlastností závislosti, může být nutné vytvořit odvozenou třídu a potom deklarovat vlastní vlastnost závislosti na odvozené třídě. Vlastnost vlastní závislosti se chová stejně jako vlastnosti závislostí definované rozhraními API WPF. Další podrobnosti o vlastních vlastnostech závislostí naleznete v tématu Vlastní vlastnosti závislosti.

Jednou z charakteristické vlastnosti závislosti, kterou nelze přepsat, je její typ hodnoty. Pokud dědíte vlastnost závislosti, která má přibližné chování, které požadujete, ale vyžadujete pro něj jiný typ, budete muset implementovat vlastní vlastnost závislosti a možná propojit vlastnosti prostřednictvím převodu typu nebo jiné implementace ve vlastní třídě. Nelze také nahradit existující ValidateValueCallback, protože toto zpětné volání existuje v samotném registračním poli, a ne v jeho metadatech.

Scénáře pro změnu existujících metadat

Pokud pracujete s metadaty existující vlastnosti závislosti, jedním z běžných scénářů pro změnu metadat vlastností závislostí je změna výchozí hodnoty. Změna nebo přidání zpětných volání systému vlastností je pokročilejší scénář. Můžete to udělat, pokud vaše implementace odvozené třídy má různé vzájemné vztahy mezi vlastnostmi závislostí. Jednou z podmíněných vlastností programovacího modelu, který podporuje jak kód, tak deklarativní použití, je, že vlastnosti musí být nastaveny v libovolném pořadí. Proto musí být všechny závislé vlastnosti nastaveny za běhu bez kontextu a nelze spoléhat na znalost pořadí nastavení, jako je například možné najít v konstruktoru. Další informace o tomto aspektu systému vlastností naleznete v tématu Zpětné volání vlastností závislostí a ověřování. Upozorňujeme, že zpětná volání ověřování nejsou součástí metadat; jsou součástí identifikátoru vlastnosti závislosti. Zpětné volání ověřování proto nelze změnit přepsáním metadat.

V některých případech můžete také chtít změnit možnosti metadat vlastností na úrovni architektury WPF u existujících vlastností závislosti. Tyto možnosti komunikují určité známé podmíněné informace o vlastnostech na úrovni architektury WPF jiným procesům architektury WPF, jako je například systém rozložení. Nastavení možností se obvykle provádí pouze při registraci nové vlastnosti závislosti, ale je také možné změnit metadata vlastností na úrovni architektury WPF jako součást OverrideMetadata nebo AddOwner volání. Konkrétní hodnoty, které se mají použít, a další informace naleznete v tématu Metadata vlastností rozhraní. Další informace, které se týkají způsobu nastavení těchto možností pro nově registrovanou vlastnost závislostí, naleznete v tématu Vlastní vlastnosti závislosti.

Přepsání metadat

Účelem přepsání metadat je primárně proto, abyste měli možnost změnit různá chování odvozená metadata, která se použijí na vlastnost závislosti, protože existuje ve vašem typu. Důvody jsou podrobněji vysvětleny v části Metadata . Další informace, včetně některých příkladů kódu, naleznete v tématu Přepsání metadat pro vlastnost závislosti.

Metadata vlastností lze zadat pro vlastnost závislosti během registračního volání (Register). V mnoha případech však můžete chtít zadat metadata specifická pro typ třídy, když dědí tuto vlastnost závislosti. Můžete to provést voláním OverrideMetadata metody. Například z rozhraní API WPF je třída typem, FrameworkElement který nejprve zaregistruje Focusable vlastnost závislosti. Control Třída však přepíše metadata pro vlastnost závislosti tak, aby poskytovala vlastní počáteční výchozí hodnotu, změnila ji na truefalse a jinak znovu používá původní Focusable implementaci.

Při přepsání metadat se různé vlastnosti metadat buď sloučí, nebo nahradí.

Toto chování je implementováno pomocí Mergea lze přepsat na odvozené třídy metadat.

Přepsání metadat připojených vlastností

Ve WPF se připojené vlastnosti implementují jako vlastnosti závislosti. To znamená, že mají také metadata vlastností, které mohou jednotlivé třídy přepsat. Otázky týkající se připojené vlastnosti v WPF jsou obecně, že každá DependencyObject z nich může mít nastavenou připojenou vlastnost. Proto může každá DependencyObject odvozená třída přepsat metadata pro jakoukoli připojenou vlastnost, protože může být nastavena na instanci třídy. Můžete přepsat výchozí hodnoty, zpětná volání nebo vlastnosti generování sestav na úrovni architektury WPF. Pokud je připojená vlastnost nastavena na instanci vaší třídy, tyto vlastnosti přepsání vlastnosti metadat platí. Můžete například přepsat výchozí hodnotu, aby vaše hodnota přepsání byla hlášena jako hodnota připojené vlastnosti u instancí vaší třídy, kdykoli vlastnost není nastavena jinak.

Poznámka:

Vlastnost Inherits není relevantní pro připojené vlastnosti.

Přidání třídy jako vlastníka existující vlastnosti závislosti

Třída se může přidat jako vlastník vlastnosti závislosti, která již byla zaregistrována pomocí AddOwner metody. To umožňuje třídě používat vlastnost závislosti, která byla původně zaregistrována pro jiný typ. Přidání třídy obvykle není odvozenou třídou typu, který poprvé zaregistroval tuto vlastnost závislosti jako vlastníka. To efektivně umožňuje vaší třídě a jeho odvozené třídy "dědit" implementaci vlastnosti závislosti bez původní třídy vlastníka a přidání třídy ve stejné skutečné hierarchii třídy. Kromě toho může přidání třídy (a všechny odvozené třídy také) poskytnout metadata specifická pro typ pro původní vlastnost závislosti.

Stejně jako přidání jako vlastník prostřednictvím metod utility systému vlastností, přidání třídy by mělo deklarovat další veřejné členy na sebe, aby se závislost vlastnost] úplný účastník v systému vlastností s expozicí kódu i značky. Třída, která přidá existující vlastnost závislosti má stejné odpovědnosti, pokud jde o vystavení objektového modelu pro danou vlastnost závislosti stejně jako třída, která definuje novou vlastnost vlastní závislosti. Prvním takovým členem, který má být vystaven, je pole identifikátoru vlastnosti závislosti. Toto pole by mělo být public static readonly pole typu DependencyProperty, které je přiřazeno k návratové hodnotě AddOwner volání. Druhým členem, který definujete, je vlastnost "obálka" modulu CLR (Common Language Runtime). Obálka umožňuje mnohem pohodlnější manipulaci s vlastností závislosti v kódu (vyhnete se volání SetValue pokaždé a může toto volání provést pouze jednou v samotném obálku). Obálka se implementuje stejně jako při registraci vlastní vlastnosti závislosti. Další informace o implementaci vlastnosti závislosti naleznete v tématu Vlastnosti vlastní závislosti a přidat typ vlastníka pro vlastnost závislosti.

AddOwner a Připojené vlastnosti

Můžete volat AddOwner vlastnost závislosti, která je definována jako připojená vlastnost třídy vlastníka. Obecně je důvodem k tomu, aby se dříve připojená vlastnost zpřístupnila jako vlastnost závislosti, která není připojena. Pak zveřejníte AddOwner návratovou public static readonly hodnotu jako pole, které se použije jako identifikátor vlastnosti závislosti, a definujete odpovídající vlastnosti "obálky", aby se vlastnost zobrazila v tabulce členů a podporovala nepoužívací vlastnost ve vaší třídě.

Viz také