O que é uma propriedade de dependência?

O que é uma propriedade de dependência no .net (especialmente no contexto do WPF). Qual é a diferença da propriedade regular?

Propriedades de dependência são propriedades de classs que derivam de DependencyObject, e elas são especiais em vez de simplesmente usar um campo de apoio para armazenar seu valor, elas usam alguns methods auxiliares em DependencyObject.

A melhor coisa sobre eles é que eles têm todo o encanamento para binding de dados embutido. Se você ligar algo a eles, eles o notificarão quando eles mudarem.

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

Basicamente, DependencyProperties diferem das propriedades regulares porque não são apenas setters / getters para os campos da class, mas recuperam seus valores reais dinamicamente durante o tempo de execução. O método SetValue() dos DPs é bastante simples e define o valor local da propriedade como o valor que você deu a ela. No entanto, quando você tenta GetValue() de um DependencyProperty, ele primeiro procurará um valor local, se nenhum estiver presente (o que é viável em DependencyProperties ao contrário das propriedades regulares) continuará na tree de UI lógica até encontrar esse valor . Se a estrutura atingir o topo da tree 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 memory que as propriedades regulares, pois somente os valores explicitamente definidos pelo usuário serão armazenados localmente.

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

Espero ter conseguido esclarecer um pouco da imprecisão 🙂

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

Um trecho:

Ponto-chave – O valor das propriedades de dependência está resolvido

O objective final de uma propriedade de dependência, como qualquer propriedade, é gerenciar o estado. Mas, ao contrário das propriedades normais do .Net, 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 da propriedade de dependência e o valor da propriedade subjacente é resolvido – o que significa que o valor é determinado pela estrutura da propriedade de dependência com base nas regras definidas pelo registro da propriedade.

Explicação sem código via Analogia (~ 5 min)

Pense nisso assim:

Todo mundo é mais ou menos o mesmo

Os seres humanos têm muita informação associada a eles. Inúmeras centenas e milhares de dados estão associados a você –

  • quantos dedos você tem

  • quantos dedos

  • quantos genes BRCA2 você tem etc

Qual é o problema que queremos resolver?

Queremos ser capazes de dar respostas diretas às pessoas que nos perguntam sobre nós mesmos.

  • Minimize a pegada de memory

Então a questão é: como você pode se lembrar de tudo isso? Bem, originalmente as pessoas começaram a escrever todas essas coisas, mas logo perceberam que precisariam carregar cerca de 10 volumes das páginas amarelas – basicamente toda a biblioteca de Alexandria (em um formato impresso) no bolso de trás para poder responda a todas essas perguntas: isso é muita coisa para carregar.

Solução: armazene informações comuns em um só lugar

Então alguém teve uma ideia shiny. Eles notaram que na maioria das vezes, a informação é a mesma. Por exemplo, a maioria das pessoas tem:

  • um coração

  • uma cara etc.

  • três genes BRCA2

Não há necessidade de cada pessoa transportar cerca de 30 quilos de papel no bolso de trás. Você pode armazenar todas essas informações em um só lugar , em uma biblioteca central. As pessoas estariam livres para andar sem serem sobrecarregadas por carregar essa informação.

Mas há sempre exceções … nem todo mundo tem o mesmo tipo de sangue, ou o mesmo número de folículos pilosos na cabeça. Se houver diferenças ou exceções da norma, você simplesmente carregaria essas exceções com você no bolso de trás, em vez de uma prateleira inteira de livros. Lembre-se, na maior parte, as pessoas são muito parecidas – elas compartilham os mesmos valores e isso raramente muda. Se você não tiver exceções anotadas no seu bolso de trás, você pode simplesmente indicar o entrevistador para os dados armazenados no repository comum.

Exemplo: Repórter entrevista o Presidente Donald Trump **

Vamos tentar isso com um exemplo.

Nós temos uma instância de Person: Donald Trump. Um repórter de notícias está fazendo algumas perguntas ao nosso prezado Presidente:

“Sr. Presidente Trump, quantos genes HIF1A você tem?”

O Don verifica seu bolso de trás. Não há nada listado sobre quantos genes ele tem. Então ele simplesmente diz ao repórter que ele tem o número padrão que todo mundo tem. “O mesmo que todos os outros”, diz Trump. “Você pode encontrar sua resposta na biblioteca”. Assim, o repórter simplesmente vai à biblioteca para descobrir esse detalhe em particular.

“Senhor Presidente Trump, quantos rostos você tem?

Este valor pode ser resolvido localmente? Parece que esse valor é resolvido localmente porque no bolso de trás de Trumps está a resposta: 2 – que é prontamente devolvida ao repórter.

Resolução de valor até uma tree

Para simplificá-lo, as coisas são resolvidas primeiro com a pessoa, e depois para cima, para a biblioteca, e se a informação não estiver contida lá, então a questão vai para uma autoridade superior: ou Deus ou o monstro espaguete, conforme o caso. . No final, você continua indo mais e mais alto até obter uma resposta. No final, todas as respostas são resolvidas.

Outra característica das Propriedades de Dependência: Valores contingentes a outros valores

Isto significa que a resposta que o Sr. Prez dá, a um repórter que lhe faz uma pergunta, depende do que alguém diz. Por exemplo, se um repórter perguntar ao Sr. Prez se ele é um bom presidente, então a resposta fornecida pode depender inteiramente do que sua peruca diz sobre si mesmo.

“Acredite em mim!” diz a peruca: “Nós vamos fazer, um grande presidente, que vai ganhar de novo! E nós vamos fazer bilhões e bilhões de dólares”.

Se a peruca diz que o Trumpster está ganhando, então quem somos nós para contender o contrário?

Resumo

Em suma, uma propriedade de dependência é uma propriedade que é resolvida localmente ou na tree da interface do usuário, conforme o caso. A razão pela qual fazemos isso é porque os elementos da interface do usuário possuem centenas e centenas de propriedades que logo consumiriam sua memory se você fosse armazená-las como campos de apoio para cada um deles. Como a maioria desses campos nunca ou muito raramente é alterada, não é necessário armazená-los como campos de apoio, e seus valores podem ser resolvidos subindo a tree. Concedido, a analogia é um pouco tensa, mas espero que seja útil (e mais importante lembrete) para alguém.

** Ainda esperando na parede (fogo) Trump prometido. Precisa manter os Spamicans fora.