Cómo: Agregar un tipo de propietario para una propiedad de dependencia

En este ejemplo se muestra cómo agregar una clase como propietario de una propiedad de dependencia registrada para un tipo diferente. Al hacerlo, tanto el lector XAML de WPF como el sistema de propiedades pueden reconocer la clase como propietario adicional de la propiedad. Agregar como propietario opcionalmente permite que la clase de adición proporcione metadatos específicos del tipo.

En el siguiente ejemplo, StateProperty es una propiedad registrada por la clase MyStateControl. La clase UnrelatedStateControl se agrega a sí misma como propietaria de la StateProperty usando el método AddOwner, específicamente usando la signatura que permite nuevos metadatos para la propiedad de dependencia tal como existe en la clase que se agrega. Tenga en cuenta que debe proporcionar descriptores de acceso de Common Language Runtime (CLR) para la propiedad similar al ejemplo que se muestra en el ejemplo Implementar una propiedad de dependencia, así como volver a exponer el identificador de propiedad de dependencia en la clase que se va a agregar como propietario.

Sin contenedores, la propiedad de dependencia seguiría funcionando desde la perspectiva del acceso mediante programación mediante GetValue o SetValue. Pero lo normal es que se quiera paralelizar este comportamiento del sistema de propiedades con los contenedores de propiedades del CLR. Los contenedores facilitan la configuración de la propiedad de dependencia mediante programación y permiten establecer las propiedades como atributos XAML.

Para averiguar cómo invalidar los metadatos predeterminados, vea Invalidar metadatos para una propiedad de dependencia.

Ejemplo

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

Vea también