Gewusst wie: Hinzufügen eines Besitzertyps für eine Abhängigkeitseigenschaft
In diesem Beispiel wird veranschaulicht, wie eine Klasse als Besitzer einer Abhängigkeitseigenschaft, die für einen anderen Typ registriert ist, hinzugefügt wird. Hierdurch kann sowohl der WPF XAML-Reader als auch das Eigenschaftensystem die Klasse als weiteren Besitzer der Eigenschaft erkennen. Das Hinzufügen als Besitzer ermöglicht optional auch das Hinzufügen der Klasse, damit typspezifische Metadaten bereitgestellt werden können.
Im folgenden Beispiel ist StateProperty eine der durch die MyStateControl-Klasse registrierte Eigenschaft. Die UnrelatedStateControl-Klasse fügt sich selbst als ein Besitzer von StateProperty mithilfe der AddOwner-Methode hinzu, wobei speziell die Signatur verwendet wird, die neue Metadaten für die Abhängigkeitseigenschaft, die im hinzufügenden Typ vorhanden sind, zulässt. Beachten Sie, dass Sie common language runtime (CLR)-Accessoren für die Eigenschaft bereitstellen müssen, ähnlich wie im Beispiel Gewusst wie: Implementieren einer Abhängigkeitseigenschaft, sowie die Kennung der Abhängigkeitseigenschaft für die Klasse, die als Besitzer hinzugefügt wird, erneut verfügbar machen müssen.
Ohne Wrapper funktioniert die Abhängigkeitseigenschaft aus der Sicht des programmgesteuerten Zugriffs mit GetValue oder SetValue trotzdem. In der Regel soll das Verhalten dieses Eigenschaftensystems jedoch parallel zu den CLR-Eigenschaftenwrappern sein. Die Wrapper vereinfachen das programmgesteuerte Festlegen der Abhängigkeitseigenschaft und ermöglichen es, diese Eigenschaften als XAML-Attribute festzulegen.
Informationen zum Überschreiben von Standardmetadaten finden Sie unter Gewusst wie: Überschreiben von Metadaten für eine Abhängigkeitseigenschaft.
Beispiel
Public Class MyStateControl
Inherits ButtonBase
Public Sub New()
MyBase.New()
End Sub
Public Property State() As Boolean
Get
Return CType(Me.GetValue(StateProperty), Boolean)
End Get
Set(ByVal value As Boolean)
Me.SetValue(StateProperty, value)
End Set
End Property
Public Shared ReadOnly StateProperty As DependencyProperty = DependencyProperty.Register("State", GetType(Boolean), GetType(MyStateControl),New PropertyMetadata(False))
End Class
...
Public Class UnrelatedStateControl
Inherits Control
Public Sub New()
End Sub
Public Shared ReadOnly StateProperty As DependencyProperty = MyStateControl.StateProperty.AddOwner(GetType(UnrelatedStateControl), New PropertyMetadata(True))
Public Property State() As Boolean
Get
Return CType(Me.GetValue(StateProperty), Boolean)
End Get
Set(ByVal value As Boolean)
Me.SetValue(StateProperty, value)
End Set
End Property
End Class
public class MyStateControl : ButtonBase
{
public MyStateControl() : base() { }
public Boolean State
{
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
}
public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
"State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
}
...
public class UnrelatedStateControl : Control
{
public UnrelatedStateControl() { }
public static readonly DependencyProperty StateProperty = MyStateControl.StateProperty.AddOwner(typeof(UnrelatedStateControl), new PropertyMetadata(true));
public Boolean State
{
get { return (Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
}
}