O que é uma propriedade de dependência?

Respostas:

94

Propriedades de dependência são propriedades de classes derivadas de DependencyObject, e são especiais porque, em vez de simplesmente usar um campo de suporte para armazenar seu valor, elas usam alguns métodos auxiliares no DependencyObject.

O melhor de tudo é que eles têm todo o encanamento para ligação de dados incorporado. Se você vincular algo a eles, eles notificarão quando mudarem.

Matt Hamilton
fonte
36
Isso ainda me diz muito pouco sobre o que uma propriedade de dependência pode fazer ou por que ela existe. Você não menciona nada de sua propriedade mais valiosa, a resolução de valor na árvore de elementos.
ProfK
oi @MattHamilton obrigado por sua resposta - mas o que você quer dizer com "eles usam alguns métodos auxiliares no DependencyObject".
BKSpurgeon
2
O @BKSpurgeon DependencyObject possui alguns métodos como "SetValue" e "GetValue", que você chama para salvar / ler o valor de uma propriedade de dependência, em vez de usar um campo de apoio.
Matt Hamilton
91

A única explicação que achei útil e bem escrita é esta: http://www.wpftutorial.net/dependencyproperties.html

Basicamente, DependencyProperties diferem das propriedades regulares, pois não são apenas setters / getters para campos da classe, mas recuperam seus valores reais dinamicamente durante o tempo de execução. O SetValue()método dos PDs é bastante direto e define o valor local da propriedade com o valor que você forneceu. No entanto, ao tentar GetValue()partir de um DependencyProperty, ele primeiro procurará um valor local, se nenhum estiver presente (o que é viável nas DependencyProperties, ao contrário das propriedades regulares), continuará na árvore lógica da interface do usuário até encontrar esse valor. Se a estrutura alcançou o topo da árvore sem encontrar nenhum valor local, ela usará um valor padrão predefinido como o valor da propriedade.

Esse método permite que DependencyProperties consuma menos memória que as propriedades regulares, pois apenas os valores que foram explicitamente definidos pelo usuário serão armazenados localmente.

E, como mencionado acima, o DependencyProperties também nos permite vincular a eles no código XAML e definir gatilhos neles, o que em propriedades regulares não é permitido.

Espero ter conseguido limpar um pouco da imprecisão :)

Jonathan Perry
fonte
2
E o que é uma "Propriedade anexada"?
Paul-Sebastian Manole
12
Uma propriedade anexada é uma propriedade que não pertence ao item atual que está sendo declarado, mas afeta outro objeto. Por exemplo: Grid.Row="1"em a Buttondefinirá a Linha 2 no pai Grid(devido ao fato de que as linhas são baseadas em zero), mas o RowDependencyProperty pertence ao Gridobjeto.
11133 Jonathan Perry
2
Quando você disse DependencyProperties also allow us to bind to them in the XAML code and set triggers on them, which on regular properties is not allowed, você quis dizer que a ligação em XAML e a configuração de gatilhos ou apenas a configuração de gatilhos não são permitidas. Agradeço pelo acompanhamento e por ajudar a tornar as coisas mais claras!
Paul-Sebastian Manole
@ Paul-SebastianManole O DataTriggers também trabalha em propriedades regulares. Vamos dizer que você tem uma Valuepropriedade (Não DP) com o valor 0 e você quiser que o seu objectivo de fazer alguma coisa quando Valuemuda para 1. Você vai ser capaz de fazê-lo usando DataTriggere definindo oBinding={Binding Path=Value, Value=1}
Jonathan Perry
36

http://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/ fornece uma boa explicação das propriedades da dependência, tanto no contexto do WF quanto do WPF.

Um trecho:

Ponto-chave - O valor das propriedades de dependência são resolvidas

O objetivo final de uma propriedade de dependência, como qualquer propriedade, é gerenciar o estado. Mas, diferentemente das propriedades .net normais, o valor da propriedade local não é armazenado em uma variável de instância.

Em vez disso, as propriedades de dependência são registradas com a estrutura de propriedades de dependência e o valor da propriedade subjacente é resolvido - o que significa que o valor é determinado pela estrutura de propriedades de dependência com base nas regras definidas pelo registro de propriedades.

Ash M
fonte