Por que .Net WPF DependencyProperties precisam ser membros estáticos da classe

StackOverflow https://stackoverflow.com/questions/36682

  •  09-06-2019
  •  | 
  •  

Pergunta

Aprendendo WPF hoje em dia.Encontrei algo novo hoje com propriedades de dependência .Net.O que eles trazem para a mesa é

  • Suporte para retornos de chamada (validação, alteração, etc)
  • Herança de propriedade
  • Propriedades anexadas

entre outros.

Mas minha pergunta aqui é por que eles precisam ser declarados como estáticos na classe que os contém?A maneira recomendada é adicionar a propriedade 'wrapper' da instância para eles.Por que ?

editar:@Matt, mas isso também não exige que o valor da propriedade também seja compartilhado entre instâncias - a menos, é claro, que seja um valor derivado?

Foi útil?

Solução

Vejo duas razões por trás desse requisito:

  1. Você não pode registrar o mesmo DP duas vezes.Para cumprir esta restrição você deve usar uma variável estática, ela será inicializada apenas uma vez, portanto você registrará o DP apenas uma vez.
  2. O DP deve ser registrado antes de qualquer instância de classe (que usa esse banco de dados) criada

Outras dicas

As propriedades de dependência são estáticas devido a uma otimização chave no WPF:Muitos dos controles no WPF possuem dezenas, senão centenas de propriedades.A maioria das propriedades nessas classes são definidas com seus valores padrão.Se os DP fossem propriedades de instância, a memória precisaria ser alocada para cada propriedade em cada objeto criado.Como os DPs são estáticos, o WPF é livre para gerenciar o uso de memória de cada propriedade de maneira mais eficaz.

A razão pela qual você deve fornecer um valor padrão para qualquer DP registrado é porque o WPF tomará cuidado para não alocar memória extra para sua propriedade quando ela for definida com seu valor padrão, não importa quantos objetos contendo essa propriedade você crie.

Acho que o motivo pelo qual você precisa da instância estática de uma propriedade de dependência é apenas porque foi assim que elas foram projetadas.O bit estático contém todos os metadados da propriedade - seu valor padrão, seu tipo de proprietário (útil se for uma propriedade anexada) etc., seus métodos de retorno de chamada para quando ele muda - esse tipo de coisa.Faz sentido armazenar essas coisas estaticamente em todas as instâncias da classe, em vez de por instância.

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