Como registrar uma propriedade anexada (WPF .NET)

Este artigo descreve como registrar uma propriedade anexada e fornecer acessadores públicos que permitem acessar a propriedade anexada por meio de código e linguagem XAML (Extensible Application Markup Language). As propriedades anexadas permitem que pares de propriedade/valor extras sejam definidos em qualquer elemento XAML, mesmo que o elemento não defina essas propriedades extras em seu modelo de objeto. As propriedades extras são acessíveis globalmente. As propriedades anexadas são normalmente definidas como uma forma especializada de propriedade de dependência que não tem um wrapper de propriedade convencional. A maioria das propriedades anexadas para tipos do Windows Presentation Foundation (WPF) também são implementadas como propriedades de dependência. Você pode criar propriedades de dependência em qualquer DependencyObject tipo derivado.

Importante

A documentação do Guia da Área de Trabalho para .NET 7 e .NET 6 está em construção.

Exemplo

O exemplo a seguir mostra como registrar uma propriedade anexada como uma propriedade de dependência, usando o RegisterAttached método. A classe provider tem a opção de especificar um valor padrão nos metadados da propriedade. Para obter mais informações sobre metadados de propriedade, consulte Metadados de propriedade de dependência. Neste exemplo, a HasFish propriedade tem um tipo de Boolean valor, com seu valor padrão definido como false.

A classe provider para uma propriedade anexada deve fornecer métodos estáticos de acessador get/set que seguem a convenção Get<property name> de nomenclatura e Set<property name>. O leitor XAML usa os acessadores para reconhecer o atributo XAML para a propriedade anexada e resolver seu valor para o tipo apropriado. Esses acessadores são necessários mesmo que uma propriedade anexada não esteja registrada como uma propriedade de dependência.

public class Aquarium : UIElement
{
    // Register an attached dependency property with the specified
    // property name, property type, owner type, and property metadata.
    public static readonly DependencyProperty HasFishProperty =
        DependencyProperty.RegisterAttached(
          "HasFish",
          typeof(bool),
          typeof(Aquarium),
          new FrameworkPropertyMetadata(defaultValue: false,
              flags: FrameworkPropertyMetadataOptions.AffectsRender)
        );

    // Declare a get accessor method.
    public static bool GetHasFish(UIElement target) =>
        (bool)target.GetValue(HasFishProperty);

    // Declare a set accessor method.
    public static void SetHasFish(UIElement target, bool value) =>
        target.SetValue(HasFishProperty, value);
}
Public Class Aquarium
    Inherits UIElement

    ' Register an attached dependency property with the specified
    ' property name, property type, owner type, and property metadata.
    Public Shared ReadOnly HasFishProperty As DependencyProperty =
        DependencyProperty.RegisterAttached("HasFish", GetType(Boolean), GetType(Aquarium),
            New FrameworkPropertyMetadata(defaultValue:=False,
                flags:=FrameworkPropertyMetadataOptions.AffectsRender))

    ' Declare a get accessor method.
    Public Shared Function GetHasFish(target As UIElement) As Boolean
        Return target.GetValue(HasFishProperty)
    End Function

    ' Declare a set accessor method.
    Public Shared Sub SetHasFish(target As UIElement, value As Boolean)
        target.SetValue(HasFishProperty, value)
    End Sub

End Class

Confira também