Metadata vlastností závislosti

systém vlastností Windows Presentation Foundation (WPF) zahrnuje systém generování sestav metadat, který překračuje rámec toho, co je možné ohlásit o vlastnosti prostřednictvím reflexe nebo obecného charakteru modulu clr (common language runtime). Metadata pro vlastnost závislosti lze také jednoznačně přiřadit třídou, která definuje vlastnost závislosti, lze změnit při přidání vlastnosti závislosti do jiné třídy a lze ji konkrétně přepsat všemi odvozenými třídami, které dědí vlastnost závislosti z definující základní třídy.

Požadavky

V tomto tématu se předpokládá, že rozumíte vlastnostem závislosti z perspektivy uživatele existujících vlastností závislosti v aplikacích WPF.

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

Metadata vlastnosti závislosti existují jako objekt, na který lze dotazovat, aby bylo možné zjistit vlastnosti závislosti. K těmto metadatům se také často používá systém vlastností při zpracovávání všech daných vlastností závislosti. Objekt metadat pro vlastnost závislosti může obsahovat následující typy informací:

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

  • Odkazy na implementace zpětného volání, které mají vliv na chování při vynucení nebo změnách v oznámení na základě typu vlastníka. Všimněte si, že tato zpětná volání jsou často definována s úrovní přístupu NonPublic, takže získání skutečných odkazů z metadat obecně není možné, pokud odkazy nejsou v rámci povoleného oboru přístupu. Další informace o zpětných voláních vlastností závislosti naleznete v tématu zpětná volání vlastností závislosti a ověřování.

  • Pokud je vlastnost závislosti považována za vlastnost na úrovni architektury WPF, metadata mohou obsahovat vlastnosti závislostí na úrovni architektury WPF, které oznamují informace a stav pro služby, jako je rozhraní WPF Framework layout a logika dědičnosti vlastností. Další informace o tomto aspektu metadat vlastností závislosti najdete v tématu Metadata vlastností rozhraní.

Rozhraní API pro metadata

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

PropertyMetadataTřída je pak odvozena z, aby poskytovala konkrétnější metadata pro divize architektury, jako jsou třídy na úrovni architektury WPF. UIPropertyMetadata Přidá vytváření sestav animace a FrameworkPropertyMetadata poskytuje vlastnosti úrovně rozhraní WPF, které jsou uvedené v předchozí části. Pokud jsou vlastnosti závislosti registrovány, mohou být registrovány s těmito PropertyMetadata odvozenými třídami. Při zkoumání metadat může být základní PropertyMetadata typ potenciálně převeden na odvozené třídy, takže můžete prozkoumat konkrétnější vlastnosti.

Poznámka

Charakteristiky vlastností, které lze zadat v FrameworkPropertyMetadata , jsou v této dokumentaci někdy označovány jako "Příznaky". Když vytváříte nové instance metadat pro použití v registrech vlastností závislosti nebo přepsání metadat, určíte tyto hodnoty pomocí výčtu FrameworkPropertyMetadataOptions flagwise a potom zadáte pravděpodobně zřetězené hodnoty výčtu do FrameworkPropertyMetadata konstruktoru. Po sestavení jsou však tyto charakteristiky možností zveřejněny v rámci FrameworkPropertyMetadata jako série logických vlastností namísto konstrukce hodnoty výčtu. Logické vlastnosti umožňují kontrolu všech podmíněných hodnot a nevyžadují, abyste použili masku na hodnotu výčtu flagwise, abyste získali informace, které vás zajímají. Konstruktor používá zřetězení FrameworkPropertyMetadataOptions , aby zachovala délku signatury konstruktoru, zatímco skutečná vytvořená metadata zpřístupňují diskrétní vlastnosti, aby bylo možné dotazování metadat intuitivnější.

Kdy přepsat metadata, kdy se má odvodit třída

Systém vlastností WPF má navázané možnosti pro změnu některých vlastností závislosti, aniž by bylo nutné je zcela znovu implementovat. Toho je možné dosáhnout vytvořením jiné instance metadat vlastnosti pro vlastnost závislosti, protože existuje pro konkrétní typ. Všimněte si, že většina existujících vlastností závislosti není virtuálními vlastnostmi, takže naprosto řečeno "opakované implementace" na zděděných třídách by mohla být zajištěna pouze pomocí stínování stávajícího člena.

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

Jednou z významných charakteristik vlastnosti závislosti, kterou nelze přepsat, je její typ hodnoty. Pokud zdědili vlastnost závislosti, která má přibližné chování, které požadujete, ale pro něj budete potřebovat jiný typ, budete muset implementovat vlastní vlastnost závislosti a možná propojit vlastnosti prostřednictvím konverze typu nebo jiné implementace na vlastní třídě. Nelze také nahradit existující ValidateValueCallback , protože toto zpětné volání existuje v samotném poli pro registraci a nikoli v rámci jeho metadat.

Scénáře změny stávajících metadat

Pokud pracujete s metadaty existující vlastnosti závislosti, jednou z běžných scénářů pro změnu metadat vlastností závislosti 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ář. To může být vhodné, pokud vaše implementace odvozené třídy má různé vztahy mezi vlastnostmi závislosti. Jedna z podmíněných prvků s programovacím modelem, 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 nemůžou se spoléhat na znalosti pořadí nastavení, jako je třeba najít v konstruktoru. Další informace o tomto aspektu systému vlastností naleznete v tématu zpětná volání vlastností závislosti a ověřování. Všimněte si, že zpětná volání ověřování nejsou součástí metadat; jsou součástí identifikátoru vlastnosti závislosti. Proto nejde zpětná volání ověřování změnit přepsáním metadat.

V některých případech můžete také změnit možnosti metadat na úrovni rozhraní WPF Framework u existujících vlastností závislosti. Tyto možnosti sdělují určité známé podmíněné podmínky týkající se vlastností na úrovni WPF Frameworku na jiné procesy na úrovni 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 OverrideMetadata vlastností na úrovni architektury WPF v rámci volání nebo AddOwner . Konkrétní hodnoty, které se mají použít, a další informace najdete v tématu Metadata vlastností rozhraní. Další informace, které se týkají způsobu nastavení těchto možností pro nově registrovanou vlastnost závislosti, najdete v tématu vlastnosti vlastních závislostí.

Přepsání metadat

Účelem přepsání metadat je primárně, abyste mohli změnit různá chování odvozená od metadat, která jsou použita na vlastnost závislosti, protože existuje pro váš typ. Důvody pro tento popis jsou podrobněji vysvětleny v části metadata . Další informace, včetně některých příkladů kódu, najdete v tématu přepis metadat pro vlastnost závislosti.

Metadata vlastnosti lze zadat pro vlastnost závislosti během volání registrace ( Register ). V mnoha případech však můžete chtít zadat metadata pro třídu specifická pro typ, pokud zdědí tuto vlastnost závislosti. To lze provést voláním OverrideMetadata metody. Například z rozhraní API FrameworkElement WPF je třída typem, který nejprve zaregistruje Focusable vlastnost Dependency. ControlAle třída Přepisuje metadata pro vlastnost závislosti tak, aby poskytovala vlastní počáteční výchozí hodnotu, změnu z false na true a jinak znovu použije původní Focusable implementaci.

Při přepsání metadat jsou jednotlivé charakteristiky metadat sloučeny nebo nahrazeny.

Toto chování je implementováno nástrojem Merge a lze je přepsat na odvozených třídách metadat.

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

V rámci WPF jsou připojené vlastnosti implementovány jako vlastnosti závislostí. To znamená, že mají také metadata vlastností, které mohou jednotlivé třídy přepsat. Hlediska rozsahu pro připojenou vlastnost v subsystému WPF jsou obecně taková DependencyObject , že k nim může být nastavena vlastnost připojené. Proto jakákoli DependencyObject odvozená třída může přepsat metadata pro jakoukoli připojenou vlastnost, jak je možné ji nastavit na instanci třídy. Můžete přepsat výchozí hodnoty, zpětná volání nebo vlastnosti pro vytváření sestav na úrovni architektury WPF. Pokud je připojená vlastnost nastavená na instanci vaší třídy, použijí se tyto charakteristiky přepsání metadat vlastností. Můžete například přepsat výchozí hodnotu, což znamená, že hodnota přepsání je hlášena jako hodnota připojené vlastnosti v instancích třídy, pokaždé, když vlastnost není jinak nastavena.

Poznámka

InheritsVlastnost není relevantní pro připojené vlastnosti.

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

Třída může přidat samu sebe jako vlastníka vlastnosti závislosti, která je již zaregistrována, pomocí AddOwner metody. To umožňuje, aby třída používala vlastnost závislosti, která byla původně registrována pro jiný typ. Třída přidání není obvykle odvozenou třídou typu, který nejprve zaregistroval tuto vlastnost závislosti jako vlastníka. To umožňuje, aby vaše třída a její odvozené třídy zdědily implementaci vlastnosti závislosti bez původní třídy vlastníka a přidání třídy je ve stejné skutečné hierarchii třídy. Kromě toho může přidat třídu (a také všechny odvozené třídy) zadat metadata specifická pro typ původní vlastnosti závislosti.

Stejně jako vlastníkem prostřednictvím metod obslužného programu systému vlastností by třída přidání měla deklarovat další veřejné členy sám o sobě, aby bylo možné vlastnost závislosti] úplný účastník v systému vlastností, který má expozici kódu i kódu. Třída, která přidává existující vlastnost závislosti, má stejné zodpovědnosti jako v případě vystavení objektového modelu pro tuto vlastnost závislosti jako třída, která definuje novou vlastní vlastnost závislosti. První takový člen, 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 vrácené hodnotě AddOwner volání. Druhý člen, který má být definován, je vlastnost "wrapper" modulu CLR (Common Language Runtime). Obálka je mnohem pohodlnější pro manipulaci s vlastností závislosti v kódu (vyhnete se voláním SetValue pokaždé a může provést volání pouze jednou v obálce samotné). Obálka je implementována stejně, jako by byla implementována v případě, že jste zaregistrovali vlastní vlastnost závislosti. Další informace o implementaci vlastnosti závislosti najdete v tématu vlastní vlastnosti závislosti a Přidání typu vlastníka pro vlastnost závislosti.

AddOwner a připojené vlastnosti

Můžete zavolat AddOwner na vlastnost závislosti, která je definována jako připojená vlastnost třídou Owner. Obecně je důvodem důvod k vystavení dříve připojené vlastnosti jako nepřipojené vlastnosti závislostí. Následně vystavíte AddOwner vrácenou hodnotu jako public static readonly pole jako identifikátor vlastnosti závislosti a definujete příslušné vlastnosti "Obálka" tak, aby se tato vlastnost zobrazila v tabulce členové a ve třídě podporovala použití nepřipojeného typu vlastnosti.

Viz také