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
.NET Desktop feedback
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de