Por que .Net WPF DependencyProperties precisam ser membros estáticos da classe
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?
Solução
Vejo duas razões por trás desse requisito:
- 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.
- 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.