Cómo: Invalidar metadatos en una propiedad de dependencia
En este ejemplo se muestra cómo invalidar los metadatos predeterminados en una propiedad de dependencia que proceden de una clase heredada. Para ello, se llama al método OverrideMetadata y se proporcionan los metadatos específicos del tipo.
Ejemplo
Al definir PropertyMetadata, una clase puede definir los comportamientos de la propiedad de dependencia, como el valor predeterminado y las devoluciones de llamada del sistema de propiedades. Muchas clases de propiedad de dependencia ya tienen metadatos predeterminados establecidos como parte de su proceso de registro. Esto incluye las propiedades de dependencia que forman parte de la WPF API. Una clase que hereda la propiedad de dependencia a través de la herencia de clase puede invalidar los metadatos originales para que las características de la propiedad que se pueden modificar mediante metadatos coincidan con los requisitos específicos de la subclase.
La invalidación de metadatos en una propiedad de dependencia debe realizarse antes de que el sistema de propiedades ponga la propiedad en uso (esto equivale al momento en el que se crean instancias de objetos que registran la propiedad). Las llamadas a OverrideMetadata se deben hacer dentro de los constructores estáticos del tipo que se proporciona como el parámetro forType
de OverrideMetadata. Si intenta cambiar los metadatos cuando ya existan instancias del tipo de propietario, no producirá excepciones, pero generará comportamientos incoherentes en el sistema de propiedades. Además, los metadatos solo se pueden invalidar una vez por tipo. Los intentos posteriores de invalidar metadatos en el mismo tipo generarán una excepción.
En el ejemplo siguiente, la clase personalizada MyAdvancedStateControl
invalida los metadatos proporcionados para StateProperty
por MyStateControl
con nuevos metadatos de propiedad. Por ejemplo, el valor predeterminado de StateProperty
es ahora true
cuando se consulta la propiedad en una instancia MyAdvancedStateControl
de construcción reciente.
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 MyAdvancedStateControl : MyStateControl
{
public MyAdvancedStateControl() : base() { }
static MyAdvancedStateControl()
{
MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
}
}
Public Class MyAdvancedStateControl
Inherits MyStateControl
Public Sub New()
MyBase.New()
End Sub
Shared Sub New()
MyStateControl.StateProperty.OverrideMetadata(GetType(MyAdvancedStateControl), New PropertyMetadata(True))
End Sub
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