Sdílet prostřednictvím


Přehled vlastností závislostí

Toto téma vysvětluje systém vlastností závislostí, který je k dispozici při psaní aplikace prostředí Windows Runtime s definicemi XAML pro uživatelské rozhraní.

Co je vlastnost závislosti?

Vlastnost závislosti je specializovaný typ vlastnosti. Konkrétně se jedná o vlastnost, ve které je hodnota vlastnosti sledována a ovlivněna vyhrazeným systémem vlastností, který je součástí prostředí Windows Runtime.

Aby bylo možné podporovat vlastnost závislosti, musí objekt, který definuje vlastnost, být DependencyObject (jinými slovy třída, která má ZávislostObject základní třídu někde ve své dědičnosti). Mnoho typů, které používáte pro definice uživatelského rozhraní pro aplikaci pro UPW s XAML, bude podtřídou DependencyObject a bude podporovat vlastnosti závislostí. Jakýkoli typ pocházející z oboru názvů Windows Runtime, který nemá v názvu "XAML", nebude podporovat vlastnosti závislosti; vlastnosti těchto typů jsou obyčejné vlastnosti, které nemají funkčnost systému závislostí.

Účelem vlastností závislostí je poskytnout systémový způsob, jak vypočítat hodnotu vlastnosti na základě jiných vstupů (jiné vlastnosti, události a stavy, ke kterým dochází v aplikaci během jeho spuštění). Mezi tyto další vstupy můžou patřit:

  • Externí vstup, například předvolba uživatele
  • Mechanismy pro určování vlastností za běhu, jako jsou datové vazby, animace a scénáře
  • Vzory šablon s více způsoby použití, jako jsou prostředky a styly
  • Hodnoty známé prostřednictvím vztahů nadřazenosti a podřízenosti s jinými prvky ve stromu objektů

Vlastnost závislosti představuje nebo podporuje konkrétní funkci programovacího modelu pro definování aplikace prostředí Windows Runtime pomocí XAML pro uživatelské rozhraní. Mezi tyto funkce patří:

  • Datová vazba
  • Styly
  • Animace ve scénáři
  • Chování PropertyChanged; Vlastnost závislosti lze implementovat tak, aby poskytovala zpětná volání, která mohou šířit změny do jiných vlastností závislosti.
  • Použití výchozí hodnoty, která pochází z metadat vlastností
  • Nástroj systému obecných vlastností, například ClearValue a vyhledávání metadat

Vlastnosti závislostí a vlastnosti prostředí Windows Runtime

Vlastnosti závislostí rozšiřují základní funkce vlastností prostředí Windows Runtime tím, že poskytují globální interní úložiště vlastností, které za běhu zálohuje všechny vlastnosti závislostí v aplikaci. Jedná se o alternativu ke standardnímu vzoru zálohování vlastnosti s privátním polem, které je soukromé ve třídě definice vlastnosti. Toto interní úložiště vlastností si můžete představit jako sadu identifikátorů a hodnot vlastností, které existují pro libovolný konkrétní objekt (pokud se jedná o DependencyObject). Místo toho, aby byla vlastnost v úložišti identifikována názvem, je identifikována instancí DependencyProperty. Systém vlastností však většinou skryje tento detail implementace: Vlastnosti závislostí můžete obvykle získat pomocí jednoduchého názvu (název programové vlastnosti v jazyce kódu, který používáte, nebo název atributu při psaní XAML).

Základní typ, který poskytuje základ systému vlastností závislostí, je DependencyObject. DependencyObject definuje metody, které mají přístup k vlastnosti závislosti, a instance DependencyObject odvozené třídy interně podporují koncept úložiště vlastností, který jsme zmínili dříve.

Tady je souhrn terminologie, kterou používáme v dokumentaci při diskuzi o vlastnostech závislostí:

Term Description
Vlastnost závislosti Vlastnost, která existuje u identifikátoru DependencyProperty (viz níže). Tento identifikátor je obvykle k dispozici jako statický člen definující DependencyObject odvozené třídy.
Identifikátor vlastnosti závislosti Konstantní hodnota pro identifikaci vlastnosti, obvykle je veřejná a jen pro čtení.
Obálka vlastností Volatelná get a set implementace pro vlastnost Windows Runtime. Nebo projekci původní definice specifickou pro jazyk. Implementace obalu vlastnosti typu get volá GetValue a předává příslušný identifikátor vlastnosti závislosti.

Obal vlastností není jen usnadněním pro volající, ale také zpřístupňuje vlastnost závislosti jakémukoli procesu, nástroji nebo projekci, které používají definice Windows Runtime pro vlastnosti.

Následující příklad definuje vlastní vlastnost závislosti pro jazyk C# a ukazuje vztah identifikátoru vlastnosti závislosti k obálce vlastnosti.

public static readonly DependencyProperty LabelProperty = DependencyProperty.Register(
  "Label",
  typeof(string),
  typeof(ImageWithLabelControl),
  new PropertyMetadata(null)
);


public string Label
{
    get { return (string)GetValue(LabelProperty); }
    set { SetValue(LabelProperty, value); }
}

Poznámka:

Předchozí příklad není určen jako úplný příklad pro vytvoření vlastní vlastnosti závislosti. Je určena k zobrazení konceptů vlastností závislostí pro každého, kdo preferuje koncepty učení prostřednictvím kódu. Podrobnější vysvětlení tohoto příkladu najdete v tématu Vlastní vlastnosti závislostí.

Priorita hodnoty vlastnosti závislosti

Když získáte hodnotu vlastnosti závislosti, získáte hodnotu, která byla určena pro tuto vlastnost prostřednictvím některého ze vstupů, které se účastní systému vlastností prostředí Windows Runtime. Priorita hodnoty vlastnosti závislosti existuje, aby systém vlastností prostředí Windows Runtime mohl vypočítat hodnoty předvídatelným způsobem a je důležité znát také základní pořadí priorit. V opačném případě se můžete ocitnout v situaci, kdy se pokoušíte nastavit vlastnost na jedné úrovni priority, ale něco jiného (systém, volající třetí strany, nějaký vlastní kód) ji nastavuje na jinou úroveň, a budete frustrovaní při pokusu zjistit, která hodnota vlastnosti je používána a odkud tato hodnota pochází.

Například styly a šablony mají být sdíleným výchozím bodem pro vytváření hodnot vlastností a tím i vzhledu ovládacího prvku. U konkrétní instance ovládacího prvku ale můžete chtít změnit jeho hodnotu oproti běžné šablonované hodnotě, například dát ovládacímu prvku jinou barvu pozadí nebo jiný textový řetězec jako obsah. Systém vlastností prostředí Windows Runtime považuje místní hodnoty s vyšší prioritou než hodnoty poskytované styly a šablonami. To umožňuje scénář, kdy hodnoty specifické pro aplikaci mohou přepsat šablony, takže ovládací prvky jsou užitečné pro vaše vlastní použití v uživatelském rozhraní aplikace.

Seznam priorit vlastností závislosti

Následuje konečné pořadí, které systém vlastností používá při přiřazování hodnoty běhu pro vlastnost závislosti. Nejvyšší priorita je uvedena jako první. Podrobnější vysvětlení najdete právě za tímto seznamem.

  1. Animované hodnoty: Aktivní animace, animace vizuálního stavu nebo animace s chováním HoldEnd Pokud chcete mít jakýkoli praktický efekt, animace použitá u vlastnosti musí mít přednost před základní (neanimovanou) hodnotou, i když byla tato hodnota nastavena místně.
  2. Místní hodnota: Místní hodnota může být nastavena přes pohodlí obálky vlastnosti, které se také rovná nastavení jako atributu nebo prvku vlastnosti v XAML, nebo voláním metody SetValue pomocí vlastnosti konkrétní instance. Pokud nastavíte místní hodnotu pomocí vazby nebo statického prostředku, každá z nich bude mít přednost, jako by byla nastavena místní hodnota, a vazby nebo odkazy na prostředky se vymažou, pokud je nastavena nová místní hodnota.
  3. Vlastnosti šablony: Prvek má tyto prvky, pokud byl vytvořen jako součást šablony (z ControlTemplate nebo DataTemplate).
  4. Nastavovače stylů: Hodnoty z Setteru v rámci stylů z stránky nebo prostředků aplikace.
  5. Výchozí hodnota: Vlastnost závislosti může mít jako součást svých metadat výchozí hodnotu.

Vlastnosti šablony

Vlastnosti šablony jako položky priority se nevztahují na žádnou vlastnost prvku, který deklarujete přímo v kódu stránky XAML. Koncept vlastnosti šablony existuje pouze pro objekty, které jsou vytvořeny, když Windows Runtime aplikuje šablonu XAML na prvek uživatelského rozhraní a tak definuje jeho vzhled.

Všechny vlastnosti nastavené ze šablony ovládacího prvku mají určité hodnoty. Tyto hodnoty jsou téměř podobné rozšířené sadě výchozích hodnot ovládacího prvku a často jsou přidružené k hodnotám, které můžete později resetovat nastavením hodnot vlastností přímo. Proto musí být hodnoty sady šablon odlišitelné od hodnoty true local, aby ji mohly přepsat všechny nové místní hodnoty.

Poznámka:

V některých případech může šablona přepsat i místní hodnoty, pokud se šabloně nepodařilo zveřejnit odkazy rozšíření pro {TemplateBinding} pro vlastnosti, které měly být nastavitelné na instancích. To se obvykle provádí pouze v případě, že vlastnost není ve skutečnosti nastavena u instancí, například pokud je relevantní pouze pro chování vizuálů a šablon, a ne pro zamýšlenou funkci nebo logiku modulu runtime ovládacího prvku, který šablonu používá.

Vazby a přednost

Operace vázání mají odpovídající prioritu v jakémkoli rozsahu, ve kterém se používají. Například {Binding} použitý na místní hodnotu se chová jako místní hodnota a značkovací rozšíření {TemplateBinding} pro setter vlastností je použit stejně jako setter stylu. Vzhledem k tomu, že vazby musí čekat na dobu běhu, aby získaly hodnoty ze zdrojů dat, proces určování priority vlastnosti se také rozšiřuje na dobu běhu.

Vazby fungují nejen ve stejné prioritě jako místní hodnota, ale ve skutečnosti se jedná o místní hodnotu, kde je vazba zástupným symbolem pro hodnotu, která je odložena. Pokud máte nastavenou vazbu pro hodnotu vlastnosti a nastavíte pro ni za běhu místní hodnotu, vazba je tím zcela nahrazena. Podobně pokud zavoláte SetBinding k definování vazby, která přichází do existence pouze za běhu, nahradíte všechny místní hodnoty, které jste mohli použít v XAML nebo dříve spuštěný kód.

Animace s scénářem a základní hodnota

Scénářované animace se řídí koncepcí základní hodnoty. Základní hodnota je hodnota určená systémem vlastností pomocí jeho priority, ale vynecháním posledního kroku hledání animací. Například základní hodnota může pocházet ze šablony ovládacího prvku nebo může pocházet z nastavení místní hodnoty v instanci ovládacího prvku. Použití animace přepíše tuto základní hodnotu a použije animovanou hodnotu po celou dobu běhu animace.

U animované vlastnosti může základní hodnota mít stále vliv na chování animace, pokud tato animace explicitně neurčuje hodnotu From a To, nebo pokud animace vrátí vlastnost k její základní hodnotě po dokončení. V těchto případech, jakmile animace skončí, znovu se použije zbytek precedence.

Animace, která specifikuje To a má chování HoldEnd, může přepsat místní hodnotu, dokud se neodebere, i když se zdá, že je vizuálně zastavena. Koncepčně se jedná o animaci, která běží navždy, i když v uživatelském rozhraní není animace vizuálu.

U jedné vlastnosti lze použít více animací. Každá z těchto animací mohla být definována tak, aby nahradila základní hodnoty, které pocházejí z různých bodů v prioritě hodnoty. Všechny tyto animace se ale budou spouštět současně v době běhu, což často znamená, že musí kombinovat své hodnoty, protože každá animace má stejný vliv na hodnotu. To závisí přesně na tom, jak jsou animace definovány, a na typu hodnoty, která se animuje.

Další informace najdete v tématu Animace ve scénářích.

Výchozí hodnoty

Vytvoření výchozí hodnoty vlastnosti závislosti s hodnotou PropertyMetadata je podrobněji vysvětleno v tématu Vlastní vlastnosti závislostí .

Vlastnosti závislostí mají stále výchozí hodnoty, i když tyto výchozí hodnoty nebyly explicitně definovány v metadatech této vlastnosti. Pokud nebyla změněna metadaty, výchozí hodnoty vlastností závislostí prostředí Windows Runtime jsou obecně jedním z následujících způsobů:

  • Vlastnost, která používá objekt runtime nebo základní typ objektu ( typ odkazu) má výchozí hodnotu null. Například DataContext je null, dokud není záměrně nastaven nebo je zděděn.
  • Vlastnost, která používá základní hodnotu, jako jsou čísla nebo logická hodnota ( typ hodnoty), používá očekávanou výchozí hodnotu pro tuto hodnotu. Například 0 pro celá a reálná čísla, false pro logickou hodnotu.
  • Vlastnost, která používá strukturu prostředí Windows Runtime, má výchozí hodnotu získanou voláním implicitního konstruktoru této struktury. Tento konstruktor používá výchozí hodnoty pro každé pole základní hodnoty struktury. Například výchozí hodnota pro bodovou hodnotu se inicializuje s hodnotami X a Y jako 0.
  • Vlastnost, která používá výčtu, má výchozí hodnotu prvního definovaného členu v daném výčtu. Zkontrolujte referenční informace o konkrétních výčtech a zjistěte, co je výchozí hodnota.
  • Vlastnost, která používá řetězec (System.String pro .NET, Platform::String pro C++/CX) má výchozí hodnotu prázdného řetězce ("").
  • Vlastnosti kolekce se obvykle neimplementují jako vlastnosti závislosti z důvodů, které jsou podrobněji popsány v tomto tématu. Pokud implementujete vlastnost vlastní kolekce a chcete, aby byla vlastností závislosti, nezapomeňte se vyhnout neúmyslnému singletonu, jak je popsáno na konci části Vlastní vlastnosti závislosti.

Funkce vlastností poskytovaná vlastností závislosti

Datová vazba

Vlastnost závislosti může mít nastavenou hodnotu prostřednictvím použití datové vazby. Datová vazba používá syntaxi rozšíření značek {Binding} v jazyce XAML, rozšíření značek {x:Bind} nebo třídu Binding v kódu. U vázané vlastnosti je konečné určení hodnoty vlastnosti odloženo až na dobu běhu programu. V té době se hodnota získá ze zdroje dat. Role, kterou zde systém vlastností závislostí hraje, je umožnění zástupného chování pro operace, jako je načtení XAML, když ještě není známa hodnota, a poté poskytnutí hodnoty za běhu prostřednictvím interakce s datovým vazebním enginem Windows Runtime.

Následující příklad nastaví Text hodnotu pro TextBlock element pomocí vazby v XAML. Vazba používá zděděný kontext dat a zdroj dat objektu. (V zkráceném příkladu se nezobrazuje žádná z těchto možností. Podrobnější ukázka znázorňující kontext a zdroj najdete v podrobné vazbě dat.)

<Canvas>
  <TextBlock Text="{Binding Team.TeamName}"/>
</Canvas>

Vazby můžete vytvořit také pomocí kódu místo XAML. Viz SetBinding.

Poznámka:

Podobné vazby se považují za místní hodnotu pro účely priority hodnoty vlastnosti závislosti. Pokud pro vlastnost, která původně držela hodnotu Vazby , nastavíte jinou místní hodnotu, přepíšete vazbu zcela, nejen hodnotu doby běhu vazby. {x:Bind} Vazby se implementují pomocí vygenerovaného kódu, který nastaví místní hodnotu vlastnosti. Pokud pro vlastnost, která používá {x:Bind}, nastavíte místní hodnotu, tato hodnota se nahradí při příštím vyhodnocení vazby, například při sledování změny vlastnosti ve zdrojovém objektu.

Vazbové zdroje, vazbové cíle, role FrameworkElement

Aby byla zdrojem vazby, nemusí být vlastnost závislostí; Obecně můžete použít jakoukoli vlastnost jako zdroj vazby, i když to závisí na programovacím jazyce a každý z nich má určité hraniční případy. Chcete-li však být cílem rozšíření značky {Binding} nebo vazby, musí být tato vlastnost vlastností závislosti. {x:Bind} nemá tento požadavek, protože používá vygenerovaný kód k použití hodnot vazby.

Pokud vytváříte vazbu v kódu, mějte na paměti, že rozhraní API SetBinding je definováno pouze pro FrameworkElement. Můžete však vytvořit definici vazby pomocí BindingOperations místo toho, a proto odkazovat na libovolnou DependencyObject vlastnost.

Pro kód nebo XAML nezapomeňte, že DataContext je FrameworkElement vlastnost. Pomocí formy dědičnosti nadřazených-podřízených vlastností (obvykle založených na zápisu XAML) může systém vazby přeložit DataContext, který existuje na nadřazeném prvku. Tato dědičnost může být vyhodnocena, i když podřízený objekt (který má cílovou vlastnost) není FrameworkElement, a proto nemá vlastní hodnotu DataContext. Nadřazený prvek, který je zděděn však musí být FrameworkElement , aby bylo možné nastavit a uchovávat DataContext. Alternativně musíte definovat vazbu tak, aby fungovala s hodnotou null pro DataContext.

Zapojení vazby není jediná věc, která je potřebná pro většinu scénářů datových vazeb. Aby jednosměrná nebo obousměrná vazba byla efektivní, musí zdrojová vlastnost podporovat oznámení o změnách, která se šíří do systému vazeb, a tím i cíl. Pro vlastní zdroje vazeb to znamená, že vlastnost musí být závislou vlastností, nebo objekt podporuje INotifyPropertyChanged. Kolekce by měly podporovat INotifyCollectionChanged. Některé třídy podporují tato rozhraní v jejich implementacích, aby byly užitečné jako základní třídy pro scénáře datových vazeb; příkladem takové třídy je ObservableCollection<T>. Další informace o datové vazbě a o tom, jak datová vazba souvisí se systémem vlastností, naleznete v tématu Datové vazby podrobně.

Poznámka:

Typy uvedené zde podporují zdroje dat Microsoft .NET. Zdroje dat C++/CX používají různá rozhraní pro oznámení o změnách nebo pozorovatelné chování, viz podrobná datová vazba.

Styly a šablony

Styly a šablony jsou dvěma scénáři pro vlastnosti, které se definují jako vlastnosti závislosti. Styly jsou užitečné pro nastavení vlastností, které definují uživatelské rozhraní aplikace. Styly jsou definovány jako prostředky v jazyce XAML, buď jako položka v kolekci Prostředků, nebo v samostatných XAML souborech, jako jsou například slovníky prostředků motivu. Styly komunikují se systémem vlastností, protože obsahují nastavitele vlastností. Nejdůležitější vlastností je control.template vlastnost ovládacího prvku: definuje většinu vizuálního vzhledu a vizuálního stavu ovládacího prvku. Další informace o stylech a příklad XAML, který definuje styl a používá setters, najdete v tématu Styling controls.

Hodnoty, které pocházejí ze stylů nebo šablon, jsou odložené hodnoty, podobně jako vazby. To znamená, že uživatelé ovládacích prvků můžou přešablonovat ovládací prvky nebo znovu definovat styly. A proto nastavovače vlastností ve stylech můžou působit pouze na závislé vlastnosti, nikoli běžné vlastnosti.

Animace ve scénáři

Hodnotu vlastnosti závislosti můžete animovat pomocí animace s scénářem. Animace ve scénáři v prostředí Windows Runtime nejsou pouze vizuální dekorace. Je užitečnější si animace představit jako techniku stavového počítače, která může nastavit hodnoty jednotlivých vlastností nebo všech vlastností a vizuálů ovládacího prvku a měnit tyto hodnoty v průběhu času.

Aby bylo možné animovat, musí být cílovou vlastností animace vlastnost závislosti. Aby bylo možné animovat, musí být typ hodnoty cílové vlastnosti podporován jedním z existujících typů animací odvozených z časové osy. Hodnoty barev, double a bodů lze animovat pomocí interpolace nebo techniky klíčových snímků. Většinu ostatních hodnot je možné animovat pomocí samostatných klíčových snímků objektu .

Když se použije a spustí animace, animované hodnoty fungují s vyšší prioritou než jakákoli hodnota (například místní hodnota), kterou má vlastnost jinak. Animace mají také volitelné chování HoldEnd, které může způsobit, že se animace aplikují na hodnoty vlastností, i když se zdá, že animace jsou vizuálně zastaveny.

Princip stavového počítače je ztělesněný použitím scénářů animací jako součást stavového modelu VisualStateManager pro ovládací prvky. Další informace o animacích ve scénářích najdete v tématu Animace s scénářem. Další informace o visualStateManager a definování vizuálních stavů pro ovládací prvky naleznete v tématu Scénáře animace pro vizuální stavy nebo šablonyovládacích prvků.

Chování při změně vlastnosti

Chování změněné vlastností je původem "závislosti" části terminologie vlastností závislostí. Udržování platných hodnot pro vlastnost, pokud jiná vlastnost může ovlivnit hodnotu první vlastnosti, je obtížné vývojový problém v mnoha architekturách. V systému vlastností prostředí Windows Runtime může každá vlastnost závislosti určit zpětné volání, které se vyvolá při každé změně jeho hodnoty vlastnosti. Toto zpětné volání lze použít k upozorňovat nebo měnit související hodnoty vlastností obecně synchronním způsobem. Mnoho existujících vlastností závislosti má chování při změně vlastnosti. Do vlastních vlastností závislostí můžete také přidat podobné chování zpětného volání a implementovat vlastní zpětná volání změněná vlastnostmi. Příklad najdete v tématu Vlastní vlastnosti závislostí .

Windows 10 zavádí metodu RegisterPropertyChangedCallback . To umožňuje kódu aplikace zaregistrovat oznámení o změnách při změně zadané vlastnosti závislosti v instanci DependencyObject.

Výchozí hodnota a ClearValue

Vlastnost závislosti může mít výchozí hodnotu definovanou jako součást metadat vlastností. U vlastnosti závislosti se její výchozí hodnota po prvním nastavení vlastnosti nestane irelevantní. Výchozí hodnota se může znovu použít za běhu, kdykoli zmizí nějaký jiný determinant v prioritě hodnoty. (Priorita hodnot vlastností závislostí je popsána v další části.) Můžete například záměrně odebrat hodnotu stylu nebo animaci, která se vztahuje na vlastnost, ale po provedení této akce chcete, aby byla hodnota rozumnou výchozí hodnotou. Výchozí hodnota vlastnosti závislosti může tuto hodnotu poskytnout, aniž by bylo nutné konkrétně nastavit hodnotu každé vlastnosti jako další krok.

Vlastnost můžete záměrně nastavit na výchozí hodnotu, i když jste ji už nastavili pomocí místní hodnoty. Chcete-li znovu nastavit na výchozí hodnotu, a také povolit ostatním účastníkům upřednostnění, kteří mohou přepsat výchozí, ale ne místní hodnotu, zavolejte metodu ClearValue (jako parametr metody uveďte vlastnost, kterou chcete vymazat). Nemusíte vždy chtít, aby vlastnost doslova používala výchozí hodnotu, ale vymazání místní hodnoty a návrat k výchozí může umožnit jiné položce získat prioritu, kterou nyní potřebujete, například použití hodnoty pocházející ze setteru stylu v šabloně ovládacího prvku.

DependencyObject a zpracování vláken

Všechny instance DependencyObject musí být vytvořeny ve vlákně uživatelského rozhraní, které je přidruženo k aktuálnímu okně zobrazenému aplikací Windows Runtime. I když musí být každý DependencyObject vytvořen v hlavním vlákně uživatelského rozhraní, lze k objektům přistupovat pomocí odkazu dispečera z jiných vláken, přístupem k vlastnosti DispatcherQueue. Pak můžete volat metody, jako je TryEnqueue , a spustit kód v rámci pravidel omezení vlákna ve vlákně uživatelského rozhraní.

Poznámka:

V případě aplikací pro UPW přejděte k vlastnosti Dispatcher . Potom můžete volat metody, jako je RunAsync u objektu CoreDispatcher , a spustit kód v rámci pravidel omezení vlákna ve vlákně uživatelského rozhraní. Další informace o rozdílech mezi UPW a WinUI pro sadu Windows App SDK najdete v tématu Migrace funkcí threadingu.

Aspekty threadingu DependencyObject jsou relevantní, protože obecně znamená, že pouze kód spuštěný ve vlákně uživatelského rozhraní může změnit nebo dokonce číst hodnotu vlastnosti závislosti. Problémy s vlákny se obvykle dají vyhnout v typickém kódu uživatelského rozhraní, který správně využívá asynchronní vzory a pracovní vlákna na pozadí. K problémům s vlákny souvisejícím s DependencyObject obvykle dochází, pokud definujete vlastní typy DependencyObject a pokusíte se je použít jako zdroje dat nebo v jiných scénářích, kdy DependencyObject nemusí být nutně vhodný.

Koncepční materiál