Sdílet prostřednictvím


Metadata vlastností závislostí (WPF .NET)

Systém vlastností Windows Presentation Foundation (WPF) obsahuje systém hlášení metadat závislých vlastností. Informace dostupné prostřednictvím systému hlášení metadat přesahují to, co je k dispozici prostřednictvím reflexe nebo obecných charakteristik CLR (Common Language Runtime). Při registraci vlastnosti závislosti máte možnost vytvořit a přiřadit k ní metadata. Pokud odvozujete z třídy, která definuje vlastnost závislosti, můžete přepsat metadata pro zděděnou vlastnost závislosti. A pokud přidáte svou třídu jako vlastníka závislostní vlastnosti, můžete přepsat metadata zděděné závislostní vlastnosti.

Požadavky

Článek předpokládá základní znalost vlastností závislostí a že jste si přečetli přehled vlastností závislostí. Pokud chcete postupovat podle příkladů v tomto článku, pomůže vám to, pokud znáte jazyk XAML (Extensible Application Markup Language) a víte, jak psát aplikace WPF.

Jak se používají metadata

Můžete dotazovat metadata vlastností závislostí, abyste prozkoumali charakteristiky vlastnosti závislosti. Když systém vlastností zpracuje vlastnost závislosti, přistupuje k jeho metadatům. Objekt metadat vlastnosti závislosti obsahuje následující typy informací:

  • Výchozí hodnota vlastnosti závislosti, která je nastavena systémem vlastností, pokud se nepoužívá žádná jiná hodnota, například místní, styl nebo hodnota dědičnosti. Další informace o prioritě hodnot při přiřazení hodnot vlastností závislostí za běhu naleznete v tématu Priorita hodnoty vlastnosti závislosti.

  • Odkazy na zpětná volání hodnoty donucení a zpětná volání změny vlastnosti na typu vlastníka. Odkazy na zpětná volání, která mají modifikátor přístupu public nebo jsou v rámci vašeho povoleného oboru přístupu, můžete získat pouze. Další informace o zpětném volání vlastností závislostí naleznete v tématu zpětné volání vlastností závislostí a ověřování.

  • Vlastnosti vlastností závislostí na úrovni architektury WPF (pokud je vlastnost závislosti vlastností architektury WPF). Procesy WPF, jako je modul rozložení frameworku a logika dědičnosti vlastností, využívají metadata na úrovni frameworku WPF. Další informace naleznete v metadatach vlastností Framework.

Rozhraní API metadat

Třída PropertyMetadata ukládá většinu metadat používaných systémem vlastností. Instance metadat je možné vytvářet a přiřazovat pomocí:

  • Typy, které registrují vlastnosti závislostí v systému vlastností.

  • Typy, které dědí z třídy, která definuje vlastnost závislosti.

  • Typy, které se přidají jako vlastník vlastnosti závislosti.

Pokud typ registruje vlastnost závislosti bez zadání metadat, systém vlastností přiřadí objekt PropertyMetadata s výchozími hodnotami pro tento typ vlastnosti závislosti.

Pokud chcete načíst metadata pro vlastnost závislosti, zavolejte jedno z GetMetadata přetížení identifikátoru DependencyProperty. Metadata se vrátí jako objekt PropertyMetadata.

Konkrétnější třídy metadat odvozené z PropertyMetadataexistují pro různé architektonické oblasti. Například UIPropertyMetadata podporuje vytváření animačních sestav a FrameworkPropertyMetadata podporuje vlastnosti architektury WPF. Vlastnosti závislostí lze také zaregistrovat u tříd odvozených z PropertyMetadata. I když GetMetadata vrací objekt PropertyMetadata, můžete v případě potřeby přetypovat na odvozený typ a prozkoumat vlastnosti specifické pro typ.

Vlastnosti, které jsou vystaveny FrameworkPropertyMetadata, jsou někdy označovány jako příznaky . Při vytváření instance FrameworkPropertyMetadata máte možnost předat instanci typu výčtu FrameworkPropertyMetadataOptions do konstruktoru FrameworkPropertyMetadata. FrameworkPropertyMetadataOptions umožňuje zadat příznaky metadat v bitové kombinaci. FrameworkPropertyMetadata používá FrameworkPropertyMetadataOptions k zachování přiměřené délky podpisu konstruktoru. Při registraci vlastnosti závislosti jsou příznaky metadat nastavené na FrameworkPropertyMetadataOptions zpřístupněny v rámci FrameworkPropertyMetadata jako vlastnosti Boolean místo bitové kombinace příznaků, aby byly charakteristiky metadat dotazu intuitivnější.

Chcete přepsat nebo vytvořit nová metadata?

Když dědíte vlastnost závislosti, máte možnost změnit vlastnosti vlastnosti závislosti přepsáním jeho metadat. Vaše scénáře vlastností závislostí ale nemusí být vždy možné uskutečnit přepsáním metadat a někdy je nutné definovat ve vaší třídě vlastní vlastnost závislosti s novými metadaty. Vlastní vlastnosti závislostí mají stejné možnosti jako vlastnosti závislostí definované typy WPF. Další informace naleznete v tématu vlastní vlastnosti závislostí.

Jednou z charakteristik vlastnosti závislosti, kterou nemůžete přepsat, je její typ hodnoty. Pokud zděděná vlastnost závislosti má přibližné chování, které potřebujete, ale váš scénář vyžaduje jiný typ hodnoty, zvažte implementaci vlastní vlastnosti závislosti. Hodnoty vlastností můžete propojit prostřednictvím převodu typu nebo jiné implementace v odvozené třídě.

Scénáře pro přepsání metadat

Příklady scénářů přepsání existujících metadat vlastností závislostí jsou:

  • Změna výchozí hodnoty, což je běžný scénář.

  • Změna nebo přidání zpětného volání změn vlastností, které mohou být nezbytné, pokud zděděná vlastnost závislostí komunikuje s jinými vlastnostmi závislosti odlišně než její základní implementace. Jednou z charakteristik programovacího modelu, který podporuje kód i revize, je, že hodnoty vlastností mohou být nastaveny v libovolném pořadí. Tento faktor může ovlivnit, jak implementujete zpětná volání při změně vlastností. Pro více informací si přečtěte sekci Zpětná volání vlastností závislostí a validace.

  • Změna možností metadat vlastností rozhraní WPF . Možnosti metadat se obvykle nastaví při registraci nové vlastnosti závislosti, ale lze je přenastavit v OverrideMetadata nebo AddOwner volání funkcí. Další informace o předefinování metadat vlastností rozhraní naleznete v tématu Určení FrameworkPropertyMetadata. Informace o tom, jak nastavit možnosti metadat rozhraní při registraci vlastnosti závislosti, naleznete v tématu vlastnosti vlastní závislosti.

Poznámka

Protože zpětná volání ověřování nejsou součástí metadat, nelze je změnit přepsáním metadat. Další informace najdete v tématu zpětná volání ověřovací hodnoty.

Přepsání metadat

Při implementaci nové vlastnosti závislosti můžete její metadata nastavit pomocí přetížení metody Register. Pokud vaše třída dědí vlastnost závislosti, můžete přepsat zděděné hodnoty metadat pomocí metody OverrideMetadata. Můžete například použít OverrideMetadata k nastavení hodnot specifických pro typ. Další informace a vzorové kódy najdete v tématu Přepis metadat pro vlastnost závislosti.

Příkladem vlastnosti závislosti WPF je Focusable. Třída FrameworkElement registruje Focusable. Třída Control je odvozena z FrameworkElement, dědí vlastnost závislosti Focusable a přepíše metadata zděděné vlastnosti. Přepsání změní výchozí hodnotu vlastnosti z false na true, ale zachová jiné zděděné hodnoty metadat.

Vzhledem k tomu, že většina existujících vlastností závislostí není virtuálními vlastnostmi, jejich zděděná implementace stínuje existujícího člena. Když přepíšete charakteristiku metadat, nahradí nová hodnota metadat původní hodnotu nebo se sloučí:

  • U DefaultValuenahradí nová hodnota stávající výchozí hodnotu. Pokud v přepisových metadatech nezadáte DefaultValue, hodnota pochází od nejbližšího nadřazeného objektu, který zadal DefaultValue v metadatech.

  • Pro PropertyChangedCallbackvýchozí logika sloučení ukládá všechny hodnoty PropertyChangedCallback v tabulce a všechny jsou vyvolány při změně vlastnosti. Pořadí zpětného volání je určeno hloubkou třídy, kdy se nejprve spustí zpětné volání registrované základní třídou v hierarchii.

  • U CoerceValueCallbacknahradí nová hodnota stávající hodnotu CoerceValueCallback. Pokud v metadatech přepsání nezadáte CoerceValueCallback, hodnota pochází z nejbližšího nadřazeného objektu, který zadal CoerceValueCallback v metadatech.

Poznámka

Výchozí logika sloučení je implementována metodou Merge. Vlastní logiku sloučení můžete zadat v odvozené třídě s děděnou vlastností závislosti, přepsáním Merge v této třídě.

Přidejte třídu jako vlastníka

Chcete-li "dědit" vlastnost závislosti zaregistrovanou v jiné hierarchii tříd, použijte metodu AddOwner. Tato metoda se obvykle používá, když přidání třídy není odvozeno z typu, který zaregistroval vlastnost závislosti. Ve volání AddOwner může třída přidání vytvořit a přiřadit metadata specifická pro typ pro zděděnou vlastnost závislosti. Abyste se stali plnohodnotným účastníkem systému vlastností prostřednictvím kódu a značkování, přidávaná třída by měla implementovat tyto veřejné členy:

  • Pole identifikátoru vlastnosti závislosti. Hodnota identifikátoru vlastnosti závislosti je návratová hodnota volání AddOwner. Toto pole by mělo být public static readonly pole typu DependencyProperty.

  • Obálka CLR, která implementuje přístupové objekty get a set. Při použití obálky vlastností mohou spotřebitelé vlastností závislostí získat nebo nastavit hodnoty vlastností závislostí stejně jako jakékoli jiné vlastnosti CLR. Přístupové objekty get a set komunikují se systémem základních vlastností prostřednictvím DependencyObject.GetValue a DependencyObject.SetValue volání a předávají identifikátor vlastnosti závislosti jako parametr. Implementujte obálku stejným způsobem jako při registraci vlastní vlastnosti vázanosti. Pro více informací viz vlastní vlastnosti závislosti

Třída, která volá AddOwner má stejné požadavky na zveřejnění objektového modelu zděděné vlastnosti závislosti jako třídy, která definuje novou vlastní vlastnost závislosti. Další informace najdete v tématu Přidání typu vlastníka pro vlastnost závislosti.

Metadata připojených vlastností

Ve WPF se většina připojených vlastností uživatelského rozhraní u typů WPF implementuje jako vlastnosti závislosti. Připojené vlastnosti implementované jako závislé vlastnosti podporují koncepty závislých vlastností, jako jsou metadata, která odvozené třídy mohou přepsat. Metadata připojené vlastnosti se obecně neliší od vlastnosti závislosti. U instancí přepisované třídy můžete přepsat výchozí hodnotu, změnit zpětná volání a vlastnosti rozhraní WPF pro zděděnou připojenou vlastnost. Další informace najdete v tématu Metadata připojených vlastností

Poznámka

Vždy použijte RegisterAttached, když v metadatech zadáváte Inherits, k registraci vlastností. I když se může zdát, že dědičnost hodnoty vlastností může fungovat pro nepřipojené závislé vlastnosti, chování dědičnosti hodnoty pro nepřipojenou vlastnost prostřednictvím určitých rozdělení objektů ve stromu běhového modulu není definováno. Vlastnost Inherits není relevantní pro nepřipojené vlastnosti. Další informace naleznete v části RegisterAttached(String, Type, Type, PropertyMetadata)a v sekci poznámky Inherits.

Přidejte třídu jako vlastníka připojené vlastnosti

Chcete-li dědit připojenou vlastnost z jiné třídy, ale vystavit ji jako nepřipojenou vlastnost závislosti ve své třídě:

  • Voláním AddOwner přidejte vaši třídu jako vlastníka k připojené vlastnosti závislosti.

  • Přiřaďte návratovou hodnotu AddOwner volání do pole public static readonly pro použití jako identifikátor vlastnosti závislosti.

  • Definujte obálku CLR, která přidá vlastnost jako člena třídy a podporuje nepopojené použití vlastnosti.

Viz také