Vlastnost závislostí a načítání XAML

Aktuální implementace WPF procesoru XAML je ze své podstaty závislé vlastnosti. Procesor WPF XAML používá metody systému vlastností pro vlastnosti závislostí při načítání binárních atributů XAML a zpracování atributů, které jsou vlastnosti závislosti. To efektivně obchází obálky vlastností. Při implementaci vlastních vlastností závislostí je nutné zohlednit toto chování a měli byste se vyhnout umístění jakéhokoli jiného kódu do obálky vlastnosti jiné než systémové metody GetValue vlastnosti a SetValue.

Předpoklady

V tomto tématu se předpokládá, že rozumíte vlastnostem závislostí jako uživatel i autor a máte přehledvlastností závislostí a vlastní vlastnosti závislostí. Měli byste také číst XAML v syntaxi WPF a XAML podrobně.

Implementace zavaděče WPF XAML a výkon

Z důvodů implementace je výpočetně méně nákladné identifikovat vlastnost jako vlastnost závislosti a přistupovat k systémové metodě vlastnosti SetValue , která ji nastaví, místo použití obálky vlastnosti a jeho setter. Důvodem je to, že procesor XAML musí odvodit celý objektový model backingového kódu pouze na základě znalosti typu a členské relace, které jsou označené strukturou značek a různých řetězců.

Tento typ se hledá prostřednictvím kombinace xmln a atributů sestavení, ale identifikace členů, určení, které by mohlo podporovat nastavení jako atribut, a překlad typů, které hodnoty vlastností podporují, by jinak vyžadoval rozsáhlé reflexe pomocí PropertyInfo. Vzhledem k tomu, že vlastnosti závislostí pro daný typ jsou přístupné jako tabulka úložiště prostřednictvím systému vlastností, wpF implementace jeho procesoru XAML používá tuto tabulku a odvodí, že jakákoli daná vlastnost ABC může být efektivnější nastavit voláním SetValue obsahujícího DependencyObject odvozeného typu pomocí identifikátoru vlastnosti závislosti ABCProperty.

Důsledky pro vlastní vlastnosti závislostí

Vzhledem k tomu, že aktuální implementace WPF chování procesoru XAML pro nastavení vlastnosti obchází obálky zcela, neměli byste do definic sady definic obálky pro vlastnost vlastní závislosti vložit žádnou další logiku. Pokud tuto logiku vložíte do definice sady, logika se nespustí, pokud je vlastnost nastavena v XAML, nikoli v kódu.

Podobně jiné aspekty procesoru XAML, které získávají hodnoty vlastností ze zpracování XAML, se používají GetValue také místo použití obálky. Proto byste se měli vyhnout jakékoli další implementaci v get definici nad rámec GetValue volání.

Následující příklad je doporučená definice vlastnosti závislosti s obálkami, kde je identifikátor vlastnosti uložen jako publicstaticreadonly pole a get definice set neobsahují žádný kód nad rámec nezbytných metod systému vlastností, které definují vlastnost závislostí backing.


public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender,
      new PropertyChangedCallback(OnUriChanged)
  )
);
public Uri AquariumGraphic
{
  get { return (Uri)GetValue(AquariumGraphicProperty); }
  set { SetValue(AquariumGraphicProperty, value); }
}

Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))
Public Property AquariumGraphic() As Uri
    Get
        Return CType(GetValue(AquariumGraphicProperty), Uri)
    End Get
    Set(ByVal value As Uri)
        SetValue(AquariumGraphicProperty, value)
    End Set
End Property

Viz také