Ottimizzazione delle prestazioni: associazione datiOptimizing Performance: Data Binding

Il data binding di Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) rappresenta per le applicazioni un modo semplice e coerente di presentare i dati e interagire con essi.Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) data binding provides a simple and consistent way for applications to present and interact with data. È possibile eseguire il data binding degli elementi a diverse origini dati sotto forma di oggetti CLRCLR e XMLXML.Elements can be bound to data from a variety of data sources in the form of CLRCLR objects and XMLXML.

Questo argomento offre utili suggerimenti sulle prestazioni del data binding.This topic provides data binding performance recommendations.

Risoluzione dei riferimenti di data bindingHow Data Binding References are Resolved

Prima di trattare i problemi di prestazioni del data binding, è opportuno scoprire come vengono risolti dal motore di data binding di Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) i riferimenti agli oggetti per il binding.Before discussing data binding performance issues, it is worthwhile to explore how the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) data binding engine resolves object references for binding.

L'origine di un data binding di Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) può essere qualsiasi oggetto CLRCLR.The source of a Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) data binding can be any CLRCLR object. È possibile eseguire il binding a proprietà, proprietà secondarie o indici di un oggetto CLRCLR.You can bind to properties, sub-properties, or indexers of a CLRCLR object. I riferimenti di associazione vengono risolte usando la reflection di Microsoft .NET Framework o un ICustomTypeDescriptor.The binding references are resolved by using either Microsoft .NET Framework reflection or an ICustomTypeDescriptor. Di seguito vengono descritti i tre metodi disponibili per risolvere riferimenti a oggetti per il data binding.Here are three methods for resolving object references for binding.

Il primo metodo prevede l'uso della reflection.The first method involves using reflection. In questo caso, il PropertyInfo oggetto viene utilizzato per individuare gli attributi della proprietà e fornisce l'accesso ai metadati della proprietà.In this case, the PropertyInfo object is used to discover the attributes of the property and provides access to property metadata. Quando si utilizza il ICustomTypeDescriptor , il motore di associazione di dati utilizza questa interfaccia per accedere ai valori di proprietà.When using the ICustomTypeDescriptor interface, the data binding engine uses this interface to access the property values. Il ICustomTypeDescriptor interfaccia risulta particolarmente utile nei casi in cui l'oggetto dispone di un set statico di proprietà.The ICustomTypeDescriptor interface is especially useful in cases where the object does not have a static set of properties.

Le notifiche di modifica di proprietà possono essere fornite mediante l'implementazione di INotifyPropertyChanged interfaccia o mediante le notifiche di modifica associate il TypeDescriptor.Property change notifications can be provided either by implementing the INotifyPropertyChanged interface or by using the change notifications associated with the TypeDescriptor. Tuttavia, la strategia consigliata per l'implementazione di notifiche di modifica delle proprietà consiste nell'utilizzare INotifyPropertyChanged.However, the preferred strategy for implementing property change notifications is to use INotifyPropertyChanged.

Se l'oggetto di origine è un CLRCLR oggetto e la proprietà di origine è un CLRCLR proprietà, il Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) motore di associazione dati è prima di tutto usare la reflection sull'oggetto di origine per ottenere il TypeDescriptor, quindi eseguire una query per un PropertyDescriptor.If the source object is a CLRCLR object and the source property is a CLRCLR property, the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) data binding engine has to first use reflection on the source object to get the TypeDescriptor, and then query for a PropertyDescriptor. Questa sequenza di operazioni di reflection richiede potenzialmente molto tempo da un punto di vista delle prestazioni.This sequence of reflection operations is potentially very time-consuming from a performance perspective.

Il secondo metodo per la risoluzione di riferimenti a oggetti richiede un CLRCLR oggetto di origine che implementa il INotifyPropertyChanged interfaccia e una proprietà di origine è un CLRCLR proprietà.The second method for resolving object references involves a CLRCLR source object that implements the INotifyPropertyChanged interface, and a source property that is a CLRCLR property. In questo caso, il motore di data binding usa direttamente la reflection sul tipo di origine e ottiene la proprietà necessaria.In this case, the data binding engine uses reflection directly on the source type and gets the required property. Sebbene presenti requisiti del working set inferiori rispetto al primo metodo, non si tratta ancora del metodo ottimale.This is still not the optimal method, but it will cost less in working set requirements than the first method.

Il terzo metodo per la risoluzione di riferimenti a oggetti richiede un oggetto di origine che è un DependencyObject e una proprietà di origine che è un DependencyProperty.The third method for resolving object references involves a source object that is a DependencyObject and a source property that is a DependencyProperty. In questo caso, non è necessario che il motore di data binding usi la reflection:In this case, the data binding engine does not need to use reflection. il motore della proprietà e il motore di data binding risolvono il riferimento alla proprietà in modo indipendente.Instead, the property engine and the data binding engine together resolve the property reference independently. Si tratta del metodo ottimale per la risoluzione dei riferimenti a oggetti usati per il data binding.This is the optimal method for resolving object references used for data binding.

Nella tabella seguente confronta la velocità del data binding di Text proprietà di mille TextBlock elementi utilizzando questi tre metodi.The table below compares the speed of data binding the Text property of one thousand TextBlock elements using these three methods.

Binding della proprietà Text di un TextBlockBinding the Text property of a TextBlock Tempo di binding (ms)Binding time (ms) Tempo di rendering: include il binding (ms)Render time -- includes binding (ms)
A una proprietà di un oggetto CLRCLRTo a property of a CLRCLR object 115115 314314
Per una proprietà di un CLRCLR oggetto che implementa INotifyPropertyChangedTo a property of a CLRCLR object which implements INotifyPropertyChanged 115115 305305
Per un DependencyProperty di un DependencyObject.To a DependencyProperty of a DependencyObject. 9090 263263

Binding a oggetti CLR di grandi dimensioniBinding to Large CLR Objects

L'esecuzione del data binding a un singolo oggetto CLRCLR con migliaia di proprietà si ripercuote in modo significativo sulle prestazioni.There is a significant performance impact when you data bind to a single CLRCLR object with thousands of properties. Per limitare questo impatto è possibile dividere il singolo oggetto in più oggetti CLRCLR con un numero inferiore di proprietà.You can minimize this impact by dividing the single object into multiple CLRCLR objects with fewer properties. La tabella illustra i tempi di binding e di rendering per il data binding a un singolo oggetto CLRCLR di grandi dimensioni rispetto a più oggetti di dimensioni inferiori.The table shows the binding and rendering times for data binding to a single large CLRCLR object versus multiple smaller objects.

Data binding di 1000 oggetti TextBlockData binding 1000 TextBlock objects Tempo di binding (ms)Binding time (ms) Tempo di rendering: include il binding (ms)Render time -- includes binding (ms)
A un oggetto CLRCLR con 1000 proprietàTo a CLRCLR object with 1000 properties 950950 12001200
A 1000 oggetti CLRCLR con una proprietàTo 1000 CLRCLR objects with one property 115115 314314

Binding a una proprietà ItemsSourceBinding to an ItemsSource

Si consideri uno scenario in cui è presente un CLRCLR List<T> oggetto che contiene un elenco di dipendenti che si desidera visualizzare in un ListBox.Consider a scenario in which you have a CLRCLR List<T> object that holds a list of employees that you want to display in a ListBox. Per creare una corrispondenza tra questi due oggetti, è necessario associare l'elenco dei dipendenti per il ItemsSource proprietà del ListBox.To create a correspondence between these two objects, you would bind your employee list to the ItemsSource property of the ListBox. Si supponga ora che un nuovo dipendente si unisca al gruppo.However, suppose you have a new employee joining your group. Si potrebbe pensare che per inserire l'associazione di questo nuovo dipendente ListBox valori, è semplicemente aggiungerlo all'elenco dei dipendenti e attendere che tale modifica venga riconosciuta automaticamente dal motore di associazione dati.You might think that in order to insert this new person into your bound ListBox values, you would simply add this person to your employee list and expect this change to be recognized by the data binding engine automatically. Questo presupposto per rivelarsi false. in realtà, la modifica non verrà verrà riflessa nel ListBox automaticamente.That assumption would prove false; in actuality, the change will not be reflected in the ListBox automatically. In questo modo il CLRCLR List<T> oggetto non genera automaticamente un evento modificato della raccolta.This is because the CLRCLR List<T> object does not automatically raise a collection changed event. Per ottenere il ListBox per rendere effettive le modifiche, è necessario ricreare l'elenco dei dipendenti e ricollegarlo al ItemsSource proprietà del ListBox.In order to get the ListBox to pick up the changes, you would have to recreate your list of employees and re-attach it to the ItemsSource property of the ListBox. Questa soluzione funziona, ma incide considerevolmente sulle prestazioni.While this solution works, it introduces a huge performance impact. Ogni volta che il ItemsSource di ListBox a un nuovo oggetto, il ListBox innanzitutto genera un'eccezione gli elementi precedenti e rigenera l'intero elenco.Each time you reassign the ItemsSource of ListBox to a new object, the ListBox first throws away its previous items and regenerates its entire list. L'impatto sulle prestazioni risulta maggiore se il ListBox esegue il mapping a un oggetto complesso DataTemplate.The performance impact is magnified if your ListBox maps to a complex DataTemplate.

Una soluzione molto efficace per questo problema consiste nel rendere l'elenco dei dipendenti un ObservableCollection<T>.A very efficient solution to this problem is to make your employee list an ObservableCollection<T>. Un ObservableCollection<T> oggetto genera una notifica di modifica che può ricevere dal motore di associazione dati.An ObservableCollection<T> object raises a change notification which the data binding engine can receive. L'evento aggiunge o rimuove un elemento da un ItemsControl senza la necessità di rigenerare l'intero elenco.The event adds or removes an item from an ItemsControl without the need to regenerate the entire list.

Nella tabella riportata di seguito mostra il tempo necessario per aggiornare il ListBox (con la virtualizzazione dell'interfaccia utente disattivata) quando viene aggiunto un elemento.The table below shows the time it takes to update the ListBox (with UI virtualization turned off) when one item is added. Il numero della prima riga rappresenta il tempo trascorso durante il CLRCLR List<T> è associato l'oggetto ListBox dell'elemento ItemsSource.The number in the first row represents the elapsed time when the CLRCLR List<T> object is bound to ListBox element's ItemsSource. Il numero nella seconda riga rappresenta il tempo trascorso quando un ObservableCollection<T> è associato il ListBox dell'elemento ItemsSource.The number in the second row represents the elapsed time when an ObservableCollection<T> is bound to the ListBox element's ItemsSource. Si noti il risparmio di molto tempo usando il ObservableCollection<T> strategia di associazione dati.Note the significant time savings using the ObservableCollection<T> data binding strategy.

Data binding della proprietà ItemsSourceData binding the ItemsSource Tempo di aggiornamento per 1 elemento (ms)Update time for 1 item (ms)
Per un CLRCLR List<T> oggettoTo a CLRCLR List<T> object 16561656
Per un ObservableCollection<T>To an ObservableCollection<T> 2020

Binding di IList a ItemsControl non IEnumerableBind IList to ItemsControl not IEnumerable

Se si dispone di una scelta tra l'associazione un IList<T> o IEnumerable per un ItemsControl oggetto, scegliere il IList<T> oggetto.If you have a choice between binding an IList<T> or an IEnumerable to an ItemsControl object, choose the IList<T> object. Associazione IEnumerable per un ItemsControl forza WPFWPF per creare un wrapper IList<T> oggetto, con conseguente calo delle prestazioni per l'overhead superfluo di un secondo oggetto.Binding IEnumerable to an ItemsControl forces WPFWPF to create a wrapper IList<T> object, which means your performance is impacted by the unnecessary overhead of a second object.

Non convertire oggetti CLR in XML solo per il data bindingDo not Convert CLR objects to XML Just for Data Binding.

WPFWPF consente di eseguire il data binding a contenuti XMLXML; il data binding a contenuti XMLXML, tuttavia, è più lento rispetto al data binding a oggetti CLRCLR. allows you to data bind to XMLXML content; however, data binding to XMLXML content is slower than data binding to CLRCLR objects. Non convertire dati di oggetti CLRCLR a XML se l'unico scopo è il data binding.Do not convert CLRCLR object data to XML if the only purpose is for data binding.

Vedere ancheSee Also

Ottimizzazione delle prestazioni di applicazioni WPFOptimizing WPF Application Performance
Pianificazione delle prestazioni dell'applicazionePlanning for Application Performance
Sfruttare appieno l'hardwareTaking Advantage of Hardware
Ottimizzazione delle prestazioni: layout e progettazioneLayout and Design
Grafica bidimensionale e creazione di immagini2D Graphics and Imaging
Comportamento dell'oggettoObject Behavior
Risorse di applicazioniApplication Resources
perText
Altri suggerimenti relativi alle prestazioniOther Performance Recommendations
Panoramica sul data bindingData Binding Overview
Procedura dettagliata: Memorizzazione dei dati di un'applicazione nella cache di un'applicazione WPFWalkthrough: Caching Application Data in a WPF Application