Propriedades de dependência
Nota
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 propriedade 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 fornece uma propriedade CLR regular e um campo somente leitura estático público armazenando uma instância de para cada propriedade de System.Windows.DependencyProperty dependência.
✔️ DO implementa propriedades de dependência chamando métodos DependencyObject.GetValue de instância e DependencyObject.SetValue.
✔️ DO nomeie o campo estático da propriedade de dependência sufixando o 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 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. Até mesmo propriedades privadas de dependência 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 Grid.Column propriedade. A propriedade representa a posição da coluna de Button (não de Grid), mas só é relevante se o Button estiver contido em uma Grid e, portanto, estiver "anexado" a Buttons by Grids.
<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 DependencyProperty.Register
método.
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 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 de propriedade ocorre quando o valor dado a um setter de propriedade é modificado por ele antes que o armazenamento de propriedade 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
.
© Partes 2005, 2009 Microsoft Corporation. Todos os direitos reservados.
Reimpresso com permissão da Pearson Education, Inc., 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 por Addison-Wesley Professional como parte da Microsoft Windows Development Series.