Sdílet prostřednictvím


Vlastnosti závislosti jen pro čtení

Toto téma popisuje vlastnosti závislosti jen pro čtení, včetně existujících vlastností závislostí jen pro čtení a scénářů a technik pro vytvoření vlastní vlastnosti závislosti jen pro čtení.

Předpoklady

V tomto tématu se předpokládá, že rozumíte základním scénářům implementace vlastnosti závislosti a způsobu použití metadat na vlastní vlastnost závislosti. Kontext najdete v tématu Vlastní vlastnosti závislostí a metadata vlastností závislostí .

Existující vlastnosti závislosti jen pro čtení

Některé vlastnosti závislosti definované v rozhraní WPF (Windows Presentation Foundation) jsou jen pro čtení. Typickým důvodem pro zadání vlastnosti závislosti jen pro čtení je, že se jedná o vlastnosti, které by se měly použít k určení stavu, ale kde je tento stav ovlivněn mnoha faktory, ale nastavení vlastnosti na tento stav není žádoucí z hlediska návrhu uživatelského rozhraní. Například vlastnost IsMouseOver je opravdu jen povrchní stav, jak je určeno ze vstupu myši. Jakékoli pokusy o programové nastavení této hodnoty obcházením skutečného vstupu myši by byly nepředvídatelné a způsobily by nekonzistence.

Z důvodu nenastavitelné závislosti jen pro čtení nejsou vhodné pro mnoho scénářů, pro které vlastnosti závislosti obvykle nabízejí řešení (konkrétně: datová vazba, přímo stylizovatelná na hodnotu, ověření, animace, dědičnost). I když nejsou nastavené vlastnosti závislostí jen pro čtení, stále mají některé další funkce podporované vlastnostmi závislostí v systému vlastností vlastností. Nejdůležitější zbývající schopností je, že vlastnost závislosti jen pro čtení je stále možné použít jako aktivační událost vlastnosti ve stylu. Triggery s normální vlastností CLR (Common Language Runtime) nelze povolit; musí to být vlastnost závislosti. Výše uvedená IsMouseOver vlastnost je dokonalým příkladem scénáře, kdy může být docela užitečné definovat styl ovládacího prvku, kde některé viditelné vlastnosti, jako je pozadí, popředí nebo podobné vlastnosti složených prvků v ovládacím prvku se změní, když uživatel umístí myš na některou definovanou oblast ovládacího prvku. Změny vlastnosti závislosti jen pro čtení lze také detekovat a hlásit vlastními procesy zneplatnění systému vlastností a to ve skutečnosti podporuje funkci aktivace vlastnosti interně.

Vytváření vlastních vlastností závislostí jen pro čtení

Nezapomeňte si přečíst výše uvedený oddíl týkající se toho, proč vlastnosti závislostí jen pro čtení nebudou fungovat pro mnoho typických scénářů závislostí. Pokud ale máte vhodný scénář, můžete chtít vytvořit vlastní vlastnost závislostí jen pro čtení.

Většina procesu vytváření vlastnosti závislosti jen pro čtení je stejná, jak je popsáno ve vlastních vlastnostech závislostí a implementace tématu vlastnosti závislosti. Existují tři důležité rozdíly:

  • Při registraci vlastnosti volejte metodu RegisterReadOnly namísto normální Register metody pro registraci vlastnosti.

  • Při implementaci vlastnosti "obálka" CLR se ujistěte, že obálka také nemá nastavenou implementaci, takže pro veřejný obálku, který zveřejňujete, neexistuje žádná nekonzistence ve stavu jen pro čtení.

  • Objekt vrácený registrací jen pro čtení je DependencyPropertyKey spíše než DependencyProperty. Toto pole byste přesto měli uložit jako člena, ale obvykle byste ho nedělali jako veřejný člen typu.

Bez ohledu na soukromé pole nebo hodnotu, které máte zálohovat vlastnost závislosti jen pro čtení, může být samozřejmě plně zapisovatelná pomocí libovolné logiky, kterou se rozhodnete. Nejjednodušším způsobem, jak nastavit vlastnost buď původně, nebo jako součást logiky modulu runtime, je použít rozhraní API systému vlastností, nikoli obejít systém vlastností a přímo nastavit privátní backingové pole. Konkrétně existuje podpis SetValue , který přijímá parametr typu DependencyPropertyKey. Jak a kde tuto hodnotu nastavíte programově v rámci logiky aplikace, bude mít vliv na to, jak můžete chtít nastavit přístup k DependencyPropertyKey vytvořenému objektu při první registraci vlastnosti závislosti. Pokud tuto logiku zpracujete v rámci třídy, můžete ji nastavit jako soukromou, nebo pokud ji potřebujete nastavit z jiných částí sestavení, můžete ji nastavit interně. Jedním z přístupů je volání SetValue v obslužné rutině události třídy relevantní události, která informuje instanci třídy, že uložená hodnota vlastnosti musí být změněna. Dalším přístupem je spojit vlastnosti závislostí pomocí spárovaných PropertyChangedCallback a CoerceValueCallback zpětných volání v rámci metadat těchto vlastností během registrace.

DependencyPropertyKey Vzhledem k tomu, že je privátní a není šířena systémem vlastností mimo váš kód, vlastnost závislostí jen pro čtení má lepší nastavení zabezpečení než vlastnost závislosti pro čtení i zápis. U vlastnosti závislosti pro čtení i zápis je identifikační pole explicitně nebo implicitně veřejné, a proto je vlastnost široce nastavená. Podrobnější informace najdete v tématu Zabezpečení vlastností závislostí.

Viz také