Partilhar via


Propriedades de dependência

Observação

Este conteúdo é reimpresso com permissão da Pearson Education, Inc., a partir de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Essa edição foi publicada em 2008 e, desde então, o livro foi totalmente revisto na terceira edição. Algumas das informações nesta página podem estar desatualizadas.

Uma propriedade de dependência (DP) é uma propriedade regular que armazena seu valor em um repositório de propriedades em vez de armazená-lo em uma variável de tipo (campo), por exemplo.

Uma propriedade de dependência anexada é um tipo de propriedade de dependência modelada como métodos estáticos Get e set que representam "propriedades" que descrevem relações entre objetos e seus contêineres (por exemplo, a posição de um Button objeto em um Panel contêiner).

✔️ DO forneça as propriedades de dependência, se você precisar que as propriedades ofereçam suporte a recursos do WPF, como estilo, gatilhos, vinculação de dados, animações, recursos dinâmicos e herança.

Design de propriedades de dependência

✔️ DO herda de , ou de um de seus subtipos, ao implementar propriedades de DependencyObjectdependência. O tipo fornece uma implementação muito eficiente de um repositório de propriedades e suporta automaticamente a vinculação de dados WPF.

✔️ DO fornecer uma propriedade CLR regular e um campo somente leitura estático público armazenando uma instância de System.Windows.DependencyProperty para cada propriedade de dependência.

✔️ DO implementa propriedades de dependência chamando métodos DependencyObject.GetValue de instância e DependencyObject.SetValue.

✔️ Nomeie o campo estático da propriedade de dependência adicionando "Propriedade" ao final do nome da propriedade.

❌ NÃO defina valores padrão de propriedades de dependência explicitamente no código; em vez disso, defina-os em metadados.

Se você definir uma propriedade padrão explicitamente, poderá impedir que essa propriedade seja definida por algum meio implícito, como um estilo.

❌ NÃO coloque código nos acessadores de propriedade que não seja o código padrão para acessar o campo estático.

Esse código não será executado se a propriedade for definida por meios implícitos, como um estilo, porque o estilo usa o campo estático diretamente.

❌ NÃO use propriedades de dependência para armazenar dados seguros. Mesmo propriedades de dependência privadas podem ser acessadas publicamente.

Design de propriedade de dependência anexada

As propriedades de dependência descritas na seção anterior representam propriedades intrínsecas do tipo declarante; por exemplo, a Text propriedade é uma propriedade de TextButton, que a declara. Um tipo especial de propriedade de dependência é a propriedade de dependência anexada.

Um exemplo clássico de uma propriedade anexada é a propriedade Grid.Column. A propriedade representa a posição da coluna do Botão (e não da Grelha), mas só é relevante se o Botão estiver contido numa Grelha e, assim, estiver "ligado" a Botões por Grelhas.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Button Grid.Column="0">Click</Button>
    <Button Grid.Column="1">Clack</Button>
</Grid>

A definição de uma propriedade anexada se parece principalmente com a de uma propriedade de dependência regular, exceto que os acessadores são representados pelos métodos estáticos Get e set:

public class Grid {

    public static int GetColumn(DependencyObject obj) {
        return (int)obj.GetValue(ColumnProperty);
    }

    public static void SetColumn(DependencyObject obj, int value) {
        obj.SetValue(ColumnProperty,value);
    }

    public static readonly DependencyProperty ColumnProperty =
        DependencyProperty.RegisterAttached(
            "Column",
            typeof(int),
            typeof(Grid)
    );
}

Validação de propriedade de dependência

As propriedades geralmente implementam o que é chamado de validação. A lógica de validação é executada quando é feita uma tentativa de alterar o valor de uma propriedade.

Infelizmente, os acessadores de propriedade de dependência não podem conter código de validação arbitrário. Em vez disso, a lógica de validação da propriedade de dependência precisa ser especificada durante o registro da propriedade.

❌ NÃO coloque a lógica de validação da propriedade de dependência nos acessadores da propriedade. Em vez disso, passe um retorno de chamada de validação para o método DependencyProperty.Register.

Notificações de alteração de propriedade de dependência

❌ NÃO implemente a lógica de notificação de alteração em acessadores de propriedade de dependência. As propriedades de dependência têm uma funcionalidade interna de notificações de alteração que deve ser usada fornecendo um callback de notificação de alteração para o PropertyMetadata.

Coerção do Valor da Propriedade de Dependência

A coerção de propriedade ocorre quando o valor atribuído a um definidor de propriedade é modificado por este antes que o armazenamento da propriedade seja realmente alterado.

❌ NÃO implemente a lógica de coerção em acessadores de propriedade de dependência.

As propriedades de dependência têm um recurso de coerção interno, e esse recurso pode ser utilizado ao fornecer um retorno de chamada de coerção para o PropertyMetadata.

© Trechos 2005, 2009 Microsoft Corporation. Todos os direitos reservados.

Reimpresso com permissão da Pearson Education, Inc., a partir de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition por Krzysztof Cwalina e Brad Abrams, publicado em 22 de outubro de 2008 pela Addison-Wesley Professional como parte da Microsoft Windows Development Series.

Ver também