Pergunta

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

Foi útil?

Solução

As propriedades de dependência são propriedades de classes derivadas do DependencyObject, e elas são especiais nisso, em vez de simplesmente usar um campo de apoio para armazenar seu valor, eles usam alguns métodos auxiliares no dependencyObject.

A melhor coisa sobre eles é que eles têm todo o encanamento para a ligação de dados incorporados. Se você vincular algo a eles, eles o notificarão quando mudarem.

Outras dicas

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

Basicamente, as redatórios da dependência 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() O método do DPS é bem direto e define o valor local da propriedade para o valor que você deu. No entanto, quando você tenta GetValue() A partir de uma dependênciaProperty, ele procurará primeiro um valor local, se não estiver presente (o que é viável nos dependênciaProperties, diferentemente das propriedades regulares), continuará subindo a árvore da interface do usuário lógica até encontrar esse valor. Se a estrutura atingir o topo da árvore sem encontrar valores locais, ela usará um valor padrão predefinido como valor da propriedade.

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

E, como mencionado acima, as redatores de dependência também nos permitem vincular a eles no código XAML e definir gatilhos neles, o que em propriedades regulares não é permitido.

Espero ter conseguido limpar parte da imprecisão :)

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

Ponto -chave - o valor das propriedades de dependência é resolvido

O objetivo final de uma propriedade de dependência, como qualquer propriedade, é gerenciar o estado. Mas, diferentemente 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 na 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)

Se você não gosta de histórias, salve -se (~ 5 minutos)

Teremos que passar por alguns conceitos:

  • Resolução de valor na herança do valor da árvore / propriedade e
  • Suporte de vários fornecedores
  • Alteração de notificações

(a) Valor Resolução / Valor da Propriedade Herança

Vamos usar o exemplo dos genes humanos para explicar o conceito.

Todo mundo é mais ou menos o mesmo

Os seres humanos têm muitas informações associadas a eles. Inúmeras centenas e milhares de dados estão associados a você -

  • Quantos dedos você tem,

  • Quantos dedos dos pés,

  • Quantos genes BRCA2 você tem etc

Qual é o problema que queremos resolver?

Queremos poder dar respostas retas a pessoas que nos perguntam sobre nós mesmos sem carregar todas essas informações.

Então, a pergunta é: como você pode se lembrar de tudo isso? Bem, originalmente as pessoas começaram a escrever todas essas coisas, mas logo perceberam que precisariam transportar cerca de 10 volumes no valor de páginas amarelas - basicamente toda a biblioteca de Alexandria (em formato de cópia impressa) no bolso de trás para poder ser capaz de poder Responda a todas essas perguntas: isso é um pouco demais para carregar.

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

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

  • um coração

  • um rosto etc.

  • Três genes BRCA2

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

Mas sempre há exceções ... nem todo mundo tem o mesmo tipo de sangue ou o mesmo número de folículos capilares na cabeça. Se houver diferenças ou exceções da norma, você simplesmente levaria essas exceções com você no bolso de trás (ou seja, em um dicionário), em vez de uma prateleira de livros inteira. Lembre -se, na maioria das vezes, as pessoas são as mesmas - elas compartilham os mesmos valores e isso raramente muda. Se você não tiver exceções escritas no seu bolso de trás, basta indicar o entrevistador aos dados armazenados no repositório comum.

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

Vamos tentar isso com um exemplo.

Temos um exemplo de pessoa: Donald Trump. Um repórter de notícias está fazendo algumas perguntas ao nosso estimado presidente:

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

O Don verifica o 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 todos os outros têm. "O mesmo que todos os outros", diz Trump. "Você pode encontrar sua resposta na biblioteca". Portanto, o repórter simplesmente vai à biblioteca para descobrir sobre esse detalhe específico.

“Sr. Presidente Trump, quantos rostos você tem?

Esse valor pode ser resolvido localmente? Parece que esse valor é resolvido localmente, porque no bolso de Trumps está a resposta: 2 - que é prontamente devolvido ao repórter.

Resolução de valor em uma árvore

Na realidade, as coisas são um pouco mais complicadas do que uma resposta no bolso de trás ou sendo mantidas em uma biblioteca central. Existem muitos lugares intermediários que poderiam armazenar as mesmas informações e, portanto, seriam candidatos ideais para "resolver o valor da propriedade". Para que as coisas possam começar no bolso traseiro, então o repórter pode ter que verificar um monte de lugares intermediários, em ordem crescente, a fim de obter a resposta. Por exemplo, o repórter pode começar com outros jornais, depois documentos judiciais e falhar em tudo isso, se nenhuma resposta for encontrada, a resposta será o valor padrão contido na Biblioteca Central.

Para simplificá -lo, as coisas são resolvidas primeiro com a pessoa e depois as autoridades superiores e superiores: acabando com Deus ou o monstro de espaguete, conforme o caso. No final, você continua cada vez mais alto até obter uma resposta. No final, todas as respostas são resolvidas.

Resumo

Em suma, uma propriedade de dependência é uma propriedade que é resolvida local ou na árvore da interface do usuário, conforme o caso. A razão pela qual fazemos isso é porque os elementos da interface do usuário têm centenas e centenas de propriedades que logo consumiam sua memória se você os armazenasse como campos de apoio para cada um deles. Como a maioria desses campos nunca ou muito raramente muda, não há necessidade de armazená -los como campos de apoio, e seus valores podem ser resolvidos subindo a árvore.

Por fim, você obtém notificação de alteração automática incorporada gratuitamente.

É verdade que a analogia é um pouco tensa, mas espero que seja útil.

** Ainda esperando o muro (incêndio) Trump prometeu. Precisa manter os spamicanos fora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top