Laden von XAML und Abhängigkeitseigenschaften

Die aktuelle WPF-Implementierung des XAML-Prozessors berücksichtigt Abhängigkeitseigenschaften. Der WPF-XAML-Prozessor verwendet beim Laden binärer XAML-Daten und beim Verarbeiten von Attributen, bei denen es sich um Abhängigkeitseigenschaften handelt, Methoden des Eigenschaftensystems für Abhängigkeitseigenschaften. Hierdurch werden die Eigenschaftenwrapper erfolgreich umgangen. Wenn Sie benutzerdefinierte Abhängigkeitseigenschaften implementieren, müssen Sie dieses Verhalten berücksichtigen. Fügen Sie keinen anderen Code in den Eigenschaftenwrapper ein als die Methoden GetValue und SetValue des Eigenschaftensystems.

Dieses Thema enthält folgende Abschnitte.

  • Vorbereitungsmaßnahmen
  • Implementierung und Leistung des WPF-XAML-Ladeprogramms
  • Auswirkungen auf benutzerdefinierte Abhängigkeitseigenschaften
  • Verwandte Abschnitte

Vorbereitungsmaßnahmen

In diesem Thema wird vorausgesetzt, dass Sie sich mit Abhängigkeitseigenschaften aus Sicht eines Consumers und eines Autors vertraut gemacht sowie Übersicht über Abhängigkeitseigenschaften und Benutzerdefinierte Abhängigkeitseigenschaften gelesen haben. Sie sollten außerdem Übersicht über XAML (WPF) und Ausführliche Erläuterung der XAML-Syntax gelesen haben.

Implementierung und Leistung des WPF-XAML-Ladeprogramms

Für Implementierungen ist es einfacher, eine Eigenschaft als Abhängigkeitseigenschaft zu erkennen und diese mit der SetValue-Methode des Eigenschaftensystems festzulegen, als den Eigenschaftenwrapper und den zugehörigen Setter zu verwenden. Der Grund hierfür ist, dass der XAML-Prozessor das gesamte Objektmodell des zugrunde liegenden Codes herleiten muss, jedoch lediglich die von der Markupstruktur vorgegebenen Typ- und Memberbeziehungen und verschiedene Zeichenfolgen bekannt sind.

Der Typ wird durch eine Kombination von xmlns- und Assembly-Attributen ermittelt, die Identifizierung der Member, die Ermittlung, welcher Member als Attribut festgelegt werden kann und welche Typen die Eigenschaftswerte unterstützen würde jedoch andernfalls eine komplexe Reflektion unter Verwendung von PropertyInfo erfordern. Da die Abhängigkeitseigenschaften für einen bestimmten Typ über das Eigenschaftensystem als Speichertabelle zugänglich sind, verwendet die WPF-Implementierung des XAML-Prozessors diese Tabelle und leitet her, dass eine gegebene Eigenschaft ABC effizienter festgelegt werden kann, indem SetValue für den enthaltenen abgeleiteten Typ DependencyObject aufgerufen wird, unter Verwendung des Abhängigkeitseigenschaft-Bezeichners ABCProperty.

Auswirkungen auf benutzerdefinierte Abhängigkeitseigenschaften

Da mit der aktuellen WPF-Implementierung des XAML-Prozessorverhaltens für das Festlegen von Eigenschaften die Wrapper vollständig umgangen werden, dürfen Sie keine weitere Logik in die Definitionen des Wrappers für die benutzerdefinierte Abhängigkeitseigenschaft einfügen. Diese Logik wird nicht ausgeführt, wenn die Eigenschaft in XAML statt in Code festgelegt wird.

Andere Aspekte des XAML-Prozessors, die Eigenschaftswerte aus der XAML-Verarbeitung abrufen, verwenden ebenfalls GetValue statt den Wrapper. Vermeiden Sie aus diesem Grund alle zusätzlichen Implementierungen in der get-Definition, die über den GetValue-Aufruf hinausgehen.

Das folgende Beispiel zeigt eine empfohlene Abhängigkeitseigenschaft-Definition mit Wrappern, wobei der Eigenschaftenbezeichner als public static readonly-Feld gespeichert wird und die get-Definition und die set-Definition außer den erforderlichen Methoden des Eigenschaftensystems, die den zugrunde liegenden Code der Abhängigkeitseigenschaft definieren, keinen weiteren Code enthalten.


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

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); }
}

Siehe auch

Konzepte

Übersicht über Abhängigkeitseigenschaften

Übersicht über XAML (WPF)

Metadaten für Abhängigkeitseigenschaften

Abhängigkeitseigenschaften vom Auflistungstyp

Sicherheit von Abhängigkeitseigenschaften

Sichere Konstruktormuster für DependencyObjects