Como substituir metadados para uma propriedade de dependência

Este exemplo mostra como substituir metadados de propriedade de dependência padrão provenientes de uma classe herdada, chamando o OverrideMetadata método e fornecendo metadados específicos do tipo.

Exemplo

Ao definir seu , uma classe pode definir os comportamentos da propriedade de dependência, como seu PropertyMetadatavalor padrão e retornos de chamada do sistema de propriedades. Muitas classes de propriedades de dependência já tem metadados padrão estabelecido como parte do processo de registro. Isso inclui as propriedades de dependência que fazem parte da API do WPF. Uma classe que herda a propriedade de dependência por meio da herança de sua classe pode substituir os metadados originais para que as características da propriedade que podem ser alteradas por meio de metadados corresponderão a qualquer requisito específico de subclasse.

A substituição de metadados em uma propriedade de dependência deve ser realizada antes da propriedade que está sendo colocada em uso pelo sistema de propriedades (isso é igual ao momento em que instâncias específicas de objetos que registram a propriedade são instanciadas). As chamadas para OverrideMetadata devem ser executadas dentro dos construtores estáticos do tipo que se fornece como o forType parâmetro de OverrideMetadata. Se você tentar alterar os metadados quando existem instâncias do tipo proprietário, isso não gerará exceções, mas resultará em comportamentos inconsistentes no sistema de propriedade. Além disso, metadados só podem ser substituído uma vez por tipo. Tentativas subsequentes de substituir os metadados no mesmo tipo gerarão uma exceção.

No exemplo a seguir, a classe personalizada MyAdvancedStateControl substitui os metadados fornecidos para StateProperty por MyStateControl com os novos metadados de propriedade. Por exemplo, o valor padrão do StateProperty agora é true quando a propriedade é consultada em uma instância MyAdvancedStateControl recém construída.

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

Confira também