Como sobrepor metadados para uma Propriedade de Dependência
Este exemplo mostra como substituir metadados de propriedade de dependência padrão que vêm de uma classe herdada, chamando o método OverrideMetadata e fornecendo metadados específicos do tipo.
Exemplo
Ao definir seu PropertyMetadata, uma classe pode definir os comportamentos da propriedade de dependência, como seu valor padrão e retornos de chamada do sistema de propriedades. Muitas classes de propriedade de dependência já têm metadados padrão estabelecidos como parte de seu 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 de sua herança de classe pode substituir os metadados originais para que as características da propriedade que podem ser alteradas por meio de metadados correspondam a quaisquer requisitos específicos de subclasse.
A substituição de metadados numa propriedade de dependência deve ser feita antes que essa propriedade seja utilizada pelo sistema de propriedades (isso equivale ao momento quando instâncias específicas de objetos que registram a propriedade são instanciadas). Chamadas para OverrideMetadata devem ser executadas dentro dos construtores estáticos do tipo que se fornece como o parâmetro forType
de OverrideMetadata. Se você tentar alterar os metadados depois que existirem instâncias do tipo proprietário, isso não gerará exceções, mas resultará em comportamentos inconsistentes no sistema de propriedades. Além disso, os metadados só podem ser substituídos uma vez por tipo. Tentativas subsequentes de substituir 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 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
Ver também
- DependencyProperty
- Visão geral das propriedades de dependência
- propriedades de dependência personalizadas
- Tópicos de instruções
.NET Desktop feedback