Sdílet prostřednictvím


Zabezpečení vlastností závislostí

Vlastnosti závislostí by se obecně měly považovat za veřejné vlastnosti. Povaha systému vlastností Windows Presentation Foundation (WPF) znemožňuje poskytnout záruky ohledně zabezpečení hodnoty závislé vlastnosti.

Přístup a zabezpečení wrapperů a vlastností závislostí

Vlastnosti závislostí se obvykle implementují spolu s vlastnostmi modulu CLR (Common Language Runtime) "wrapper", které zjednodušují získávání nebo nastavování vlastnosti z instance. Obálky jsou ale v podstatě jen metody pro snadné použití, které implementují základní statické volání GetValue a SetValue, jež se používají při práci s vlastnostmi závislostí. Když o tom přemýšlíte jiným způsobem, vlastnosti jsou vystaveny jako vlastnosti CLR (Common Language Runtime), které jsou podporovány vlastností závislosti, nikoli privátním polem. Mechanismy zabezpečení aplikované na obálky neodpovídají chování systému vlastností a přístupu k základnímu prvku závislosti. Umístění poptávky po zabezpečení na obálku zabrání pouze použití metody pohodlí, ale nezabrání voláním GetValue nebo SetValue. Podobně umístění chráněné nebo soukromé úrovně přístupu na obálky neposkytuje žádné efektivní zabezpečení.

Pokud vytváříte vlastní vlastnosti závislosti, měli byste deklarovat obaly a pole identifikátoru DependencyProperty jako veřejné členy, aby volající nedostávali zavádějící informace o skutečné úrovni přístupu k této vlastnosti (kvůli tomu, že úložiště je implementováno jako vlastnost závislosti).

U vlastní závislé vlastnosti můžete tuto vlastnost zaregistrovat jako vlastnost pouze pro čtení. Tímto způsobem účinně zabráníte, aby vlastnost mohla být nastavena kýmkoli, kdo nemá referenci na DependencyPropertyKey této vlastnosti. Další informace naleznete v tématu Read-Only vlastnosti závislosti.

Poznámka

Deklarace privátního pole identifikátoru DependencyProperty není zakázáno a lze ji použít k omezení okamžitě vystaveného oboru názvů vlastní třídy, ale tato vlastnost by neměla být považována za "soukromou" ve stejném smyslu jako definice jazyka CLR (Common Language Runtime) definují tuto úroveň přístupu z důvodů popsaných v další části.

Systémová expozice vlastností závislostí

Obecně to není užitečné a je potenciálně zavádějící, deklarovat DependencyProperty jako jakoukoli jinou úroveň přístupu než veřejnou. Toto nastavení úrovně přístupu brání někomu, aby mohl získat odkaz na instanci z deklarující třídy. Existuje však několik aspektů systému vlastností, které vrátí DependencyProperty jako způsob identifikace konkrétní vlastnosti, protože existuje v instanci třídy nebo odvozené instanci třídy, a tento identifikátor je stále použitelný v SetValue volání, i když je původní statický identifikátor deklarován jako nepublikovaný. Také OnPropertyChanged virtuální metody obdrží informace o jakékoli existující vlastnosti závislosti, která změnila hodnotu. Kromě toho metoda GetLocalValueEnumerator vrací identifikátory pro libovolnou vlastnost u instancí s místně nastavenou hodnotou.

Ověřování a zabezpečení

Použití poptávky na ValidateValueCallback a očekávání selhání ověřovacího procesu při selhání poptávky, aby se zabránilo nastavení vlastnosti, není dostatečným bezpečnostním mechanismem. Zrušení nastavení hodnoty vynucené prostřednictvím ValidateValueCallback může být také potlačeno škodlivými volajícími, za předpokladu, že tito volající operují v doméně aplikace.

Viz také