Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A associação de dados do WPF (Windows Presentation Foundation) oferece uma forma simples e consistente para os aplicativos apresentarem e interagirem com os dados. Os elementos podem ser associados a dados de uma variedade de fontes de dados na forma de objetos CLR e XML.
Este tópico apresenta recomendações de desempenho de associação de dados.
Como as referências de associação de dados são resolvidas
Antes de discutir problemas de desempenho de associação de dados, vale a pena explorar como o mecanismo de associação de dados do WPF (Windows Presentation Foundation) resolve as referências de objeto para associação.
A origem de uma associação de dados do WPF (Windows Presentation Foundation) pode ser qualquer objeto CLR. Você pode vincular a propriedades, sub-propriedades ou indexadores de um objeto CLR. As referências de associação são resolvidas por meio de uma reflexão do Microsoft .NET Framework ou um ICustomTypeDescriptor. Confira três métodos para resolver as referências de objeto para associação.
O primeiro método envolve o uso de reflexão. Nesse caso, o objeto PropertyInfo é usado para descobrir os atributos da propriedade e fornece acesso aos metadados da propriedade. Ao usar a interface ICustomTypeDescriptor, o mecanismo de associação de dados usa essa interface para acessar os valores da propriedade. A interface ICustomTypeDescriptor é especialmente útil em casos em que o objeto não tem um conjunto estático de propriedades.
As notificações de alteração de propriedade podem ser fornecidas pela implementação da interface INotifyPropertyChanged ou pelo uso das notificações de alteração associadas ao TypeDescriptor. No entanto, a estratégia preferencial para implementar notificações de alteração de propriedade é usar INotifyPropertyChanged.
Se o objeto de origem for um objeto CLR e a propriedade de origem for uma propriedade CLR, o mecanismo de associação de dados do WPF (Windows Presentation Foundation) deverá primeiro usar a reflexão sobre o objeto de origem para obter o TypeDescriptore, em seguida, consultar um PropertyDescriptor. Essa sequência de operações de reflexão é potencialmente muito demorada de uma perspectiva de desempenho.
O segundo método para resolver referências de objeto envolve um objeto de origem CLR que implementa a interface INotifyPropertyChanged e uma propriedade de origem que é uma propriedade CLR. Nesse caso, o mecanismo de associação de dados usa a reflexão diretamente no tipo de fonte e obtém a propriedade necessária. Esse ainda não é o melhor método, mas ele custará menos nos requisitos de conjunto de trabalho do que o primeiro método.
O terceiro método para resolver as referências de objeto envolve um objeto de origem que é um DependencyObject e uma propriedade de origem que é uma DependencyProperty. Nesse caso, o mecanismo de associação de dados não precisa usar a reflexão. Em vez disso, o mecanismo de propriedade e o mecanismo de vinculação de dados resolvem juntos a referência da propriedade independentemente. Esse é o melhor método para resolver as referências de objeto usadas para associação de dados.
A tabela abaixo compara a velocidade da associação de dados da propriedade Text de mil elementos TextBlock usando esses três métodos.
| Vincular a propriedade Text de um TextBlock | Tempo de Ligação (ms) | Tempo de renderização – Inclui a associação (ms) |
|---|---|---|
| Para uma propriedade de um objeto CLR | 115 | 314 |
| Para uma propriedade de um objeto CLR que implementa INotifyPropertyChanged | 115 | 305 |
| Para um DependencyProperty de um DependencyObject. | 90 | 263 |
Associação a objetos CLR grandes
Há um impacto significativo no desempenho quando os dados são associados a um único objeto CLR com milhares de propriedades. Você pode minimizar esse impacto dividindo o único objeto em vários objetos CLR com menos propriedades. A tabela mostra os tempos de associação e renderização para associação de dados a um único objeto CLR grande versus vários objetos menores.
| Associação de dados de 1000 objetos TextBlock | Tempo de Ligação (ms) | Tempo de renderização – Inclui a associação (ms) |
|---|---|---|
| Para um objeto CLR com 1000 propriedades | 950 | 1.200 |
| Para mil objetos CLR com uma propriedade | 115 | 314 |
Associação de um Fonte de Itens
Considere um cenário no qual você tem um objeto CLRList<T> que contém uma lista de funcionários que você deseja exibir em um ListBox. Para criar uma correspondência entre esses dois objetos, você associará sua lista de funcionários à propriedade ItemsSource da ListBox. No entanto, suponha que você tenha um novo funcionário ingressando em seu grupo. Você pode pensar que, para inserir essa nova pessoa em seus valores ListBox associados, basta adicioná-la à lista de funcionários e esperar que essa alteração seja reconhecida automaticamente pelo mecanismo de associação de dados. Essa suposição seria falsa; na verdade, a alteração não será refletida na ListBox automaticamente. Isso ocorre porque o objeto CLRList<T> não gera automaticamente um evento alterado de coleção. Para que o ListBox reconheça as alterações, você precisará recriar sua lista de funcionários e anexá-la novamente à propriedade ItemsSource do ListBox. Embora essa solução funcione, ela apresenta um enorme impacto no desempenho. Cada vez que você reatribui a ItemsSource de ListBox a um novo objeto, a ListBox primeiro joga fora os itens anteriores e regenera toda a lista. O impacto no desempenho é ampliado se o ListBox for mapeado para um DataTemplatecomplexo.
Uma solução muito eficiente para esse problema é tornar sua lista de funcionários uma ObservableCollection<T>. Um objeto ObservableCollection<T> gera uma notificação de alteração que o mecanismo de associação de dados pode receber. O evento adiciona ou remove um item de um ItemsControl sem a necessidade de regenerar toda a lista.
A tabela abaixo mostra o tempo necessário para atualizar a ListBox (com a virtualização da interface do usuário desativada) quando um item é adicionado. O número na primeira linha representa o tempo decorrido quando o objeto CLRList<T> está associado ao ListBoxdo elemento ItemsSource. O número na segunda linha representa o tempo decorrido quando uma ObservableCollection<T> é associada à ListBox do elemento ItemsSource. Observe a significativa economia de tempo quando a estratégia de associação de dados da ObservableCollection<T> é usada.
| Associação de dados de ItemsSource | Tempo de atualização para um item (ms) |
|---|---|
| Para um objeto CLRList<T> | 1656 |
| Para uma ObservableCollection<T> | 20 |
Associar IList a ItemsControl, não a IEnumerable
Se você tiver uma opção entre associar um IList<T> ou um IEnumerable a um objeto ItemsControl, escolha o objeto IList<T>. Associar IEnumerable a um ItemsControl força o WPF a criar um objeto IList<T> de wrapper, o que significa que o seu desempenho é afetado pela sobrecarga desnecessária de um segundo objeto.
Não converta objetos CLR em XML Just for Data Binding.
O WPF permite que você associe dados ao conteúdo XML; no entanto, a associação de dados ao conteúdo XML é mais lenta do que a associação de dados a objetos CLR. Não converta os dados do objeto CLR em XML se a única finalidade for a associação de dados.
Consulte também
- Otimizando o Desempenho do Aplicativo WPF
- Planejamento para o Desempenho de Aplicativos
- Aproveitando a Vantagem do Hardware
- Layout e design
- Gráficos e Imagens 2D
- Comportamento do Objeto
- Recursos de Aplicativo
- Texto
- outras recomendações de desempenho
- Visão Geral do Data Binding
- Passo a passo: Como armazenar dados de aplicativos em cache em um aplicativo WPF
.NET Desktop feedback