Laden von XAML und AbhängigkeitseigenschaftenXAML Loading and Dependency Properties

Die aktuelle WPFWPF-Implementierung des XAMLXAML-Prozessors ist mit Abhängigkeitseigenschaften kompatibel.The current WPFWPF implementation of its XAMLXAML processor is inherently dependency property aware. Der WPFWPF-XAMLXAML-Prozessor verwendet Methoden des Eigenschaftensystems zum Laden von binären XAMLXAML und zum Verarbeiten von Attributen, die Abhängigkeitseigenschaften sind.The WPFWPF XAMLXAML processor uses property system methods for dependency properties when loading binary XAMLXAML and processing attributes that are dependency properties. Dadurch werden Eigenschaftenwrapper praktisch umgangen.This effectively bypasses the property wrappers. Wenn Sie benutzerdefinierte Abhängigkeitseigenschaften implementieren, Sie müssen für dieses Verhalten berücksichtigen sollten gehalten und keinem anderen Code in Ihrer Eigenschaftenwrapper als das System Eigenschaftenmethoden GetValue und SetValue.When you implement custom dependency properties, you must account for this behavior and should avoid placing any other code in your property wrapper other than the property system methods GetValue and SetValue.

Erforderliche KomponentenPrerequisites

In diesem Thema wird davon ausgegangen, dass Sie Abhängigkeitseigenschaften sowohl aus Sicht eines Anwenders als auch der eines Autors verstehen, und dass Sie Übersicht über Abhängigkeitseigenschaften und Benutzerdefinierte Abhängigkeitseigenschaften gelesen haben.This topic assumes that you understand dependency properties both as consumer and author and have read Dependency Properties Overview and Custom Dependency Properties. Sie sollten auch Übersicht über XAML (WPF) und Ausführliche Erläuterung der XAML-Syntax gelesen haben.You should also have read XAML Overview (WPF) and XAML Syntax In Detail.

Implementierung und Leistung des WPF-XAML-LadeprogrammsThe WPF XAML Loader Implementation, and Performance

Aus Gründen der Implementierung ist weniger rechenintensiv zu identifiziert eine Eigenschaft als Abhängigkeitseigenschaft im Eigenschaftensystem zugreifen SetValue Methode, um diesen, anstatt den Eigenschaftenwrapper und die Setter-Methode festgelegt.For implementation reasons, it is computationally less expensive to identify a property as a dependency property and access the property system SetValue method to set it, rather than using the property wrapper and its setter. Grund hierfür ist, dass der XAMLXAML-Prozessor das gesamte Objektmodell des unterstützenden Codes allein auf Basis der Typ- und Mitgliedsbeziehungen, die durch die Markupstruktur und verschiedene Zeichenfolgen erkennbar sind, herleiten muss.This is because a XAMLXAML processor must infer the entire object model of the backing code based only on knowing the type and member relationships that are indicated by the structure of the markup and various strings.

Der Typ mit einer Kombination von Xmlns und Assemblyattribute jedoch identifizieren die Elemente, die ermittelt werden, unterstützen kann, der als ein Attribut festgelegt nachgeschlagen und welche Typen die Eigenschaftswerte unterstützen andernfalls würde eine umfangreiche Reflektion erfordern Mithilfe von PropertyInfo.The type is looked up through a combination of xmlns and assembly attributes, but identifying the members, determining which could support being set as an attribute, and resolving what types the property values support would otherwise require extensive reflection using PropertyInfo. Da Abhängigkeitseigenschaften für einen bestimmten Typ als eine Speichertabelle durch das Eigenschaftensystem zugegriffen werden die WPFWPF Implementierung seiner XAMLXAML Prozessor verwendet diese Tabelle, und leitet alle angegebene Eigenschaft ABC kann effizienter festgelegt werden, durch den Aufruf SetValue für das enthaltende DependencyObject abgeleiteten Typ unter Verwendung des Bezeichners der Abhängigkeitseigenschaft ABCProperty.Because dependency properties on a given type are accessible as a storage table through the property system, the WPFWPF implementation of its XAMLXAML processor uses this table and infers that any given property ABC can be more efficiently set by calling SetValue on the containing DependencyObject derived type, using the dependency property identifier ABCProperty.

Auswirkungen auf Benutzerdefinierte AbhängigkeitseigenschaftenImplications for Custom Dependency Properties

Da die aktuelle WPFWPF-Implementierung des XAMLXAML-Prozessorverhaltens für die Festlegung von Eigenschaften die Wrapper vollständig umgeht, dürfen Sie keine zusätzliche Logik in die Set-Definitionen des Wrappers für die benutzerdefinierte Abhängigkeitseigenschaft einfügen.Because the current WPFWPF implementation of the XAMLXAML processor behavior for property setting bypasses the wrappers entirely, you should not put any additional logic into the set definitions of the wrapper for your custom dependency property. Wenn Sie solche Logik in der Set-Definition einfügen, wird diese Logik nicht ausgeführt werden, wenn die Eigenschaft in XAMLXAML statt in Code festgelegt wird.If you put such logic in the set definition, then the logic will not be executed when the property is set in XAMLXAML rather than in code.

Auf ähnliche Weise andere Aspekte der der XAMLXAML Prozessor, wie die Eigenschaftswerte aus abrufen XAMLXAML Verarbeitung auch verwenden GetValue statt den Wrapper.Similarly, other aspects of the XAMLXAML processor that obtain property values from XAMLXAML processing also use GetValue rather than using the wrapper. Aus diesem Grund auch sollten Sie alle zusätzliche-Implementierung in der get Definition außerhalb der GetValue aufrufen.Therefore, you should also avoid any additional implementation in the get definition beyond the GetValue call.

Das folgende Beispiel ist eine empfohlene Definition von Abhängigkeitseigenschaften mit Wrappern, wobei der Eigenschaftenbezeichner als public static readonly-Feld gespeichert wird und die get- und set-Definitionen keinen Code außer den erforderlichen Systemmethoden enthalten, die die Unterstützung der Abhängigkeitseigenschaft definieren.The following example is a recommended dependency property definition with wrappers, where the property identifier is stored as a public static readonly field, and the get and set definitions contain no code beyond the necessary property system methods that define the dependency property 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

Siehe auchSee Also

Übersicht über AbhängigkeitseigenschaftenDependency Properties Overview
Übersicht über XAML (WPF)XAML Overview (WPF)
Metadaten für AbhängigkeitseigenschaftenDependency Property Metadata
Abhängigkeitseigenschaften vom AuflistungstypCollection-Type Dependency Properties
Sicherheit von AbhängigkeitseigenschaftenDependency Property Security
Sichere Konstruktormuster für DependencyObjectsSafe Constructor Patterns for DependencyObjects