Compartir a través de


Cómo: Invalidar metadatos en una propiedad de dependencia

Actualización: noviembre 2007

En este ejemplo se muestra cómo invalidar los metadatos de propiedad de dependencia predeterminados que proceden de una clase heredada, llamando al método OverrideMetadata y proporcionando metadatos específicos del tipo.

Ejemplo

Mediante la definición de PropertyMetadata, una clase puede definir los comportamientos de una propiedad de dependencia, tales como su valor predeterminado las y devoluciones de llamada del sistema de propiedades. Muchas clases de propiedades de dependencia ya tienen metadatos predeterminados establecidos como parte de su proceso de registro. Esto incluye las propiedades de dependencia que forman parte de las API de WPF. Una clase que hereda la propiedad de dependencia a través de su herencia de clases puede invalidar los metadatos originales de tal forma 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 se debe hacer antes de colocar esa propiedad para su uso por el sistema de propiedades (esto equivale al momento en que se crean instancias específicas de los objetos que registran la propiedad). Las llamadas a OverrideMetadata se deben realizar dentro de los constructores estáticos del tipo que se proporciona como parámetro forType de OverrideMetadata. Si se intentan cambiar los metadatos después de que existan instancias de tipo de propietario, no se iniciarán excepciones, pero se provocarán comportamientos incoherentes en el sistema de propiedades. Asimismo, los metadatos sólo se pueden invalidar una vez para cada tipo. Cualquier intento subsiguiente de invalidar los metadatos en el mismo tipo iniciará una excepción.

En el ejemplo siguiente, la clase MyAdvancedStateControl personalizada invalida los metadatos proporcionados para StateProperty mediante MyAdvancedStateControl con nuevos metadatos de propiedad. Ahora, por ejemplo, el valor predeterminado de StateProperty es true cuando se consulta la propiedad en una instancia de MyAdvancedStateControl recién construida.

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 MyAdvancedStateControl : MyStateControl
{
  public MyAdvancedStateControl() : base() { }
  static MyAdvancedStateControl()
  {
    MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
  }
}

Vea también

Conceptos

Información general sobre las propiedades de dependencia

Propiedades de dependencia personalizadas

Referencia

DependencyProperty

Otros recursos

Temas "Cómo..." sobre propiedades

Ejemplos de propiedades