Delen via


XAML-eigenschappen voor laden en afhankelijkheid

De huidige WPF-implementatie van de XAML-processor is inherent bewust van afhankelijkheidseigenschappen. De WPF XAML-processor maakt gebruik van eigenschappensysteemmethoden voor afhankelijkheidseigenschappen bij het laden van binaire XAML en verwerkingskenmerken die afhankelijkheidseigenschappen zijn. Hierdoor worden de property wrappers effectief omzeild. Wanneer u aangepaste afhankelijkheidseigenschappen implementeert, moet u rekening houden met dit gedrag en moet u voorkomen dat andere code in de eigenschapswikkelaar wordt geplaatst dan de methoden van het eigenschappensysteem GetValue en SetValue.

Voorwaarden

Dit onderwerp gaat ervan uit dat u afhankelijkheidseigenschappen begrijpt, zowel als consument als auteur, en dat u Overzicht van afhankelijkheidseigenschappen en Aangepaste afhankelijkheidseigenschappenhebt gelezen. U moet ook XAML in WPF en XAML-syntaxis in Detailhebben gelezen.

De implementatie en prestaties van de WPF XAML Loader

Om implementatieredenen is het computationeel minder kostbaar om een eigenschap als afhankelijkheidseigenschap te identificeren en toegang te krijgen tot de eigenschapssysteem SetValue-methode om deze in te stellen, in plaats van de eigenschapswikkelaar en de setter ervan te gebruiken. Dit komt doordat een XAML-processor het volledige objectmodel van de backingcode moet afleiden op basis van het weten van het type en de lidrelaties die worden aangegeven door de structuur van de markeringen en verschillende tekenreeksen.

Het type wordt opgezocht via een combinatie van xmlns en assembly-kenmerken, maar het identificeren van de leden, bepalen welke als kenmerk kunnen worden ingesteld, en het verhelderen van de typen die door de eigenschapswaarden worden ondersteund, zou anders uitgebreide reflectie vereisen met behulp van PropertyInfo. Omdat afhankelijkheidseigenschappen van een bepaald type toegankelijk zijn als een opslagtabel via het eigenschappensysteem, gebruikt de WPF-implementatie van de XAML-processor deze tabel en wordt afgeleid dat een bepaalde eigenschap ABC- efficiƫnter kan worden ingesteld door SetValue aan te roepen op het betreffende DependencyObject afgeleide type, met behulp van de id van de afhankelijkheidseigenschap ABCProperty.

Gevolgen voor aangepaste eigenschappen van afhankelijkheden

Omdat de huidige WPF-implementatie van het XAML-processorgedrag voor eigenschapsinstelling de wrappers volledig omzeilt, moet u geen aanvullende logica in de setdefinities van de wrapper plaatsen voor uw aangepaste afhankelijkheidseigenschap. Als u dergelijke logica in de setdefinitie plaatst, wordt de logica niet uitgevoerd wanneer de eigenschap is ingesteld in XAML in plaats van in code.

Op dezelfde manier gebruiken andere aspecten van de XAML-processor die eigenschapswaarden verkrijgen van XAML-verwerking ook GetValue in plaats van de wrapper te gebruiken. Daarom moet u ook eventuele extra implementaties in de get definitie buiten de GetValue-aanroep vermijden.

Het volgende voorbeeld is een aanbevolen definitie van de afhankelijkheidseigenschap met wrappers, waarbij de eigenschaps-id wordt opgeslagen als een publicstaticreadonly veld, en de get- en set definities geen code bevatten buiten de benodigde eigenschapssysteemmethoden die de back-up van de afhankelijke eigenschap definiƫren.


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

Zie ook