Compartir a través de


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