Como adicionar um tipo de proprietário para uma propriedade de dependência

Este exemplo mostra como adicionar uma classe como um proprietário de uma propriedade de dependência registrado para um tipo diferente. Ao fazer isso, o leitor XAML do WPF e o sistema de propriedades são capazes de reconhecer a classe como um proprietário adicional da propriedade. Adicionar como proprietário opcionalmente permite que a classe de adição forneça os metadados específicos do tipo.

No exemplo a seguir, StateProperty é uma propriedade registrada pela classe MyStateControl. A classe UnrelatedStateControl adiciona-se como um proprietário do StateProperty usando o AddOwner método, especificamente usando a assinatura que permite novos metadados para a propriedade de dependência como ela existe no tipo de adição. Observe que você deve fornecer acessadores CLR (Common Language Runtime) para a propriedade semelhante ao exemplo mostrado no exemplo Implementar uma propriedade de dependência, bem como expor novamente o identificador de propriedade de dependência na classe que está sendo adicionada como proprietário.

Sem wrappers, a propriedade de dependência ainda funcionaria da perspectiva do acesso programático usando GetValue ou SetValue. Mas você normalmente deseja paralelizar esse comportamento do sistema de propriedades com os wrappers de propriedade CLR. Os wrappers facilitam a definição da propriedade de dependência programaticamente e tornam possível definir as propriedades como atributos XAML.

Para saber como substituir metadados padrão, consulte Substituir metadados para uma propriedade de dependência.

Exemplo

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 UnrelatedStateControl : Control
{
  public UnrelatedStateControl() { }
  public static readonly DependencyProperty StateProperty = MyStateControl.StateProperty.AddOwner(typeof(UnrelatedStateControl), new PropertyMetadata(true));
  public Boolean State
  {
    get { return (Boolean)this.GetValue(StateProperty); }
    set { this.SetValue(StateProperty, value); }
  }
}
Public Class UnrelatedStateControl
    Inherits Control
  Public Sub New()
  End Sub
  Public Shared ReadOnly StateProperty As DependencyProperty = MyStateControl.StateProperty.AddOwner(GetType(UnrelatedStateControl), New PropertyMetadata(True))
  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
End Class

Confira também