Propriedades de Dependência
Observação
Este conteúdo é reimpresso com permissão da Pearson Education, Inc. 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 revisado na terceira edição. Algumas das informações nesta página podem estar desatualizadas.
Uma DP (propriedade de dependência) é 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 Get and Set estáticos que representam "propriedades" que descrevem relações entre objetos e seus contêineres (por exemplo, a posição de um objeto Button
em um contêiner Panel
).
✔️ FORNEÇA as propriedades de dependência, se você precisar das propriedades para dar suporte a recursos do WPF, como estilo, gatilhos, vinculação de dados, animações, recursos dinâmicos e herança.
Design da propriedade de dependência
✔️ HERDE de DependencyObject, ou um de seus subtipos, ao implementar propriedades de dependência. O tipo fornece uma implementação muito eficiente de um repositório de propriedades e dá suporte automaticamente à vinculação de dados do WPF.
✔️ FORNEÇA uma propriedade CLR regular e um campo somente leitura estático público que armazena uma instância de System.Windows.DependencyProperty para cada propriedade de dependência.
✔️ IMPLEMENTE propriedades de dependência chamando métodos de instância DependencyObject.GetValue e DependencyObject.SetValue.
✔️ NOMEIE o campo estático da propriedade de dependência sufixo do nome da propriedade com "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 explicitamente um padrão de propriedade, poderá impedir que essa propriedade seja definida por alguns meios implícitos, como um estilo.
❌ NÃO coloque código nos acessadores de propriedade diferentes do 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. Até mesmo propriedades de dependência privada 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 de declaração; por exemplo, a propriedade Text
é 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 de Botão (não de Grade), mas só será relevante se o Botão estiver contido em uma grade e, portanto, estiver "anexado" a Botões por Grades.
<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 Get and Set estáticos:
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 da 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 para 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 de propriedade de dependência precisa ser especificada durante o registro da propriedade.
❌ NÃO coloque a lógica de validação de 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 nos acessadores de propriedade de dependência. As propriedades de dependência têm um recurso interno de notificações de alteração que deve ser usado fornecendo um retorno de chamada de notificação de alteração para o PropertyMetadata.
Coerção do valor da propriedade de dependência
A coerção da propriedade ocorre quando o valor fornecido a um setter de propriedade é modificado pelo setter antes que o repositório de propriedades seja realmente modificado.
❌ 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 podem ser usadas fornecendo um retorno de chamada de coerção para o PropertyMetadata
.
Portions © 2005, 2009 Microsoft Corporation. Todos os direitos reservados.
Reimpresso com permissão da Pearson Education, Inc. das Diretrizes de Design do Framework: convenções, linguagens e padrões para bibliotecas do .NET reutilizável, 2ª edição por Krzysztof Cwalina e Brad Abrams, publicado em 22 de outubro de 2008 por Addison-Wesley Professional como parte da série de desenvolvimento do Microsoft Windows.