Optimieren der Leistung: DatenbindungOptimizing Performance: Data Binding

Die Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)-Datenbindung bietet für Anwendungen eine einfache und konsistente Möglichkeit, Daten darzustellen und mit ihnen zu interagieren.Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) data binding provides a simple and consistent way for applications to present and interact with data. Elemente können an Daten aus einer Vielzahl von Datenquellen in Form von CLR-Objekten und XMLXMLgebunden werden.Elements can be bound to data from a variety of data sources in the form of CLR objects and XMLXML.

In diesem Thema erhalten Sie Empfehlungen bezüglich der Datenbindung.This topic provides data binding performance recommendations.

So werden Datenbindungsverweise aufgelöstHow Data Binding References are Resolved

Vor der Erläuterung von Problemen bei der Leistung der Datenbindung kann es sinnvoll sein, zu erfahren, wie die Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)-Datenbindungs-Engine Objektverweise für die Bindung auflöst.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.

Bei der Quelle einer Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Datenbindung kann es sich um ein beliebiges CLR-Objekt handeln.The source of a Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) data binding can be any CLR object. Sie können an Eigenschaften, unter Eigenschaften oder Indexer eines CLR-Objekts binden.You can bind to properties, sub-properties, or indexers of a CLR object. Die Bindungs Verweise werden entweder mithilfe Microsoft .NET Framework-Reflektion oder ICustomTypeDescriptormithilfe von aufgelöst.The binding references are resolved by using either Microsoft .NET Framework reflection or an ICustomTypeDescriptor. Dies sind drei Methoden zu Auflösung von Objektverweisen für die Bindung.Here are three methods for resolving object references for binding.

In der ersten Methode verwenden Sie die Reflektion.The first method involves using reflection. In diesem Fall wird das PropertyInfo -Objekt verwendet, um die Attribute der Eigenschaft zu ermitteln und den Zugriff auf die Metadaten der Eigenschaft bereitzustellen.In this case, the PropertyInfo object is used to discover the attributes of the property and provides access to property metadata. Bei Verwendung der ICustomTypeDescriptor -Schnittstelle verwendet die Daten Bindungs-Engine diese Schnittstelle, um auf die Eigenschaftswerte zuzugreifen.When using the ICustomTypeDescriptor interface, the data binding engine uses this interface to access the property values. Die ICustomTypeDescriptor -Schnittstelle ist besonders nützlich, wenn das Objekt nicht über einen statischen Satz von Eigenschaften verfügt.The ICustomTypeDescriptor interface is especially useful in cases where the object does not have a static set of properties.

Eigenschafts Änderungs Benachrichtigungen können entweder durch Implementieren der INotifyPropertyChanged -Schnittstelle oder durch Verwendung der der zugeordneten TypeDescriptorÄnderungs Benachrichtigungen bereitgestellt werden.Property change notifications can be provided either by implementing the INotifyPropertyChanged interface or by using the change notifications associated with the TypeDescriptor. Die bevorzugte Strategie zum Implementieren von Benachrichtigungen über Eigenschafts Änderungen ist jedoch INotifyPropertyChangeddie Verwendung von.However, the preferred strategy for implementing property change notifications is to use INotifyPropertyChanged.

Wenn das Quell Objekt ein CLR-Objekt ist und die Source-Eigenschaft eine CLR-Eigenschaft Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) ist, muss die Daten Bindungs-Engine zuerst die Reflektion für das Quell TypeDescriptorObjekt verwenden, um den zu PropertyDescriptorerhalten, und dann eine Abfrage für eine durchführen.If the source object is a CLR object and the source property is a CLR 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. Diese Folge von Reflektionsvorgängen kann hinsichtlich der Leistung sehr zeitaufwändig sein.This sequence of reflection operations is potentially very time-consuming from a performance perspective.

Die zweite Methode zum Auflösen von Objekt verweisen umfasst ein CLR-Quell Objekt, INotifyPropertyChanged das die-Schnittstelle implementiert, und eine Quell Eigenschaft, die eine CLR-Eigenschaft ist.The second method for resolving object references involves a CLR source object that implements the INotifyPropertyChanged interface, and a source property that is a CLR property. In diesem Fall wendet die Datenbindungs-Engine die Reflektion direkt auf die Quelle an und erhält die erforderliche Eigenschaft.In this case, the data binding engine uses reflection directly on the source type and gets the required property. Dies stellt immer noch nicht die optimale Methode dar, aber sie hat weniger Workingsetanforderungen als die erste Methode.This is still not the optimal method, but it will cost less in working set requirements than the first method.

Die dritte Methode zum Auflösen von Objekt verweisen umfasst ein Quell Objekt, das DependencyObject eine ist, und eine Quell Eigenschaft DependencyProperty, die eine ist.The third method for resolving object references involves a source object that is a DependencyObject and a source property that is a DependencyProperty. In diesem Fall muss die Datenbindungs-Engine keine Reflektion verwenden.In this case, the data binding engine does not need to use reflection. Stattdessen lösen die Eigenschaften-Engine und die Datenbindungs-Engine gemeinsam und unabhängig den Eigenschaftenverweis auf.Instead, the property engine and the data binding engine together resolve the property reference independently. Dies stellt die optimale Methode für das Auflösen von Objektverweisen für die Datenbindung dar.This is the optimal method for resolving object references used for data binding.

In der folgenden Tabelle wird die Geschwindigkeit der Datenbindung Text für die- TextBlock Eigenschaft der 1000-Elemente mithilfe dieser drei Methoden verglichen.The table below compares the speed of data binding the Text property of one thousand TextBlock elements using these three methods.

Bindung einer Text-Eigenschaft an einen TextBlockBinding the Text property of a TextBlock Bindungszeit (in ms)Binding time (ms) Renderingzeit, einschließlich Bindung (in ms)Render time -- includes binding (ms)
An eine Eigenschaft eines CLR-ObjektsTo a property of a CLR object 115115 314314
An eine Eigenschaft eines CLR-Objekts, das implementiertINotifyPropertyChangedTo a property of a CLR object which implements INotifyPropertyChanged 115115 305305
Zu einem DependencyProperty DependencyObjecteines.To a DependencyProperty of a DependencyObject. 9090 263263

Bindung an große CLR-ObjekteBinding to Large CLR Objects

Wenn Sie Daten an ein einzelnes CLR-Objekt mit Tausenden von Eigenschaften binden, wirkt sich dies erheblich auf die Leistung aus.There is a significant performance impact when you data bind to a single CLR object with thousands of properties. Sie können diese Auswirkung minimieren, indem Sie das einzelne Objekt in mehrere CLR-Objekte mit weniger Eigenschaften aufteilen.You can minimize this impact by dividing the single object into multiple CLR objects with fewer properties. In der Tabelle werden die Bindungs-und Renderingzeiten für die Datenbindung an ein einzelnes großes CLR-Objekt im Vergleich zu mehreren kleineren Objekten angezeigt.The table shows the binding and rendering times for data binding to a single large CLR object versus multiple smaller objects.

Datenbindung an 1000 TextBlock-ObjekteData binding 1000 TextBlock objects Bindungszeit (in ms)Binding time (ms) Renderingzeit, einschließlich Bindung (in ms)Render time -- includes binding (ms)
Zu einem CLR-Objekt mit 1000-EigenschaftenTo a CLR object with 1000 properties 950950 12001200
Zu 1000 CLR-Objekten mit einer EigenschaftTo 1000 CLR objects with one property 115115 314314

Bindung an eine ItemsSourceBinding to an ItemsSource

Stellen Sie sich ein Szenario vor, in dem Sie List<T> über ein CLR-Objekt verfügen, das eine Liste von Mitarbeitern enthält ListBox, die Sie in einem anzeigen möchten.Consider a scenario in which you have a CLR List<T> object that holds a list of employees that you want to display in a ListBox. Um eine Entsprechung zwischen diesen beiden Objekten zu erstellen, binden Sie die Employee-Liste ItemsSource an die- ListBoxEigenschaft des-Objekts.To create a correspondence between these two objects, you would bind your employee list to the ItemsSource property of the ListBox. Gehen Sie nun davon aus, dass ein neuer Angestellter dazu kommt.However, suppose you have a new employee joining your group. Wenn Sie diese neue Person in Ihre gebundenen ListBox Werte einfügen möchten, können Sie diese Person einfach Ihrer Mitarbeiterliste hinzufügen und erwarten, dass diese Änderung automatisch von der Datenbindungs-Engine erkannt wird.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. Diese Annahme würde false belegen. in Wirklichkeit wird die Änderung nicht ListBox automatisch in wiedergegeben.That assumption would prove false; in actuality, the change will not be reflected in the ListBox automatically. Dies liegt daran, dass das List<T> CLR-Objekt nicht automatisch ein Auflistungs geändertes Ereignis aufhebt.This is because the CLR List<T> object does not automatically raise a collection changed event. Um die ListBox Änderungen zu übernehmen, müssen Sie die Liste der Mitarbeiter neu erstellen und an die ItemsSource -Eigenschaft des ListBoxanfügen.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. Obwohl diese Lösung funktioniert, beeinträchtigt sie die Leistung deutlich.While this solution works, it introduces a huge performance impact. Jedes Mal, wenn Sie den ItemsSource von ListBox einem neuen-Objekt zuweisen, ListBox löst der erste seine vorherigen Elemente aus und generiert seine gesamte Liste erneut.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. Die Auswirkungen auf die Leistung werden vergrößert, ListBox Wenn Sie einem komplexen DataTemplatezuordnen.The performance impact is magnified if your ListBox maps to a complex DataTemplate.

Eine äußerst effiziente Lösung für dieses Problem besteht darin, die Mitarbeiterliste ObservableCollection<T>zu zu machen.A very efficient solution to this problem is to make your employee list an ObservableCollection<T>. Ein ObservableCollection<T> -Objekt löst eine Änderungs Benachrichtigung aus, die von der Datenbindungs-Engine empfangen werden kann.An ObservableCollection<T> object raises a change notification which the data binding engine can receive. Das Ereignis fügt ein Element ItemsControl hinzu oder entfernt dieses, ohne die gesamte Liste neu generieren zu müssen.The event adds or removes an item from an ItemsControl without the need to regenerate the entire list.

Die folgende Tabelle zeigt die Zeit, die benötigt wird, ListBox um das zu aktualisieren (bei deaktivierter benutzeroberflächenvirtualisierung), wenn ein Element hinzugefügt wird.The table below shows the time it takes to update the ListBox (with UI virtualization turned off) when one item is added. Die Zahl in der ersten Zeile stellt die verstrichene Zeit dar, List<T> zu der das CLR- ItemsSourceObjekt an ListBox den Element gebunden ist.The number in the first row represents the elapsed time when the CLR List<T> object is bound to ListBox element's ItemsSource. Die Zahl in der zweiten Zeile stellt die verstrichene Zeit ObservableCollection<T> dar, die an ListBox den des ItemsSourceElements gebunden ist.The number in the second row represents the elapsed time when an ObservableCollection<T> is bound to the ListBox element's ItemsSource. Beachten Sie die erheblichen Zeiteinsparungen mithilfe ObservableCollection<T> der Strategie für die Datenbindung.Note the significant time savings using the ObservableCollection<T> data binding strategy.

Datenbindung der ItemsSourceData binding the ItemsSource Zeit für das Aktualisieren eines Elements (in ms)Update time for 1 item (ms)
Zu einem CLR List<T> -ObjektTo a CLR List<T> object 16561656
Zu einemObservableCollection<T>To an ObservableCollection<T> 2020

Bindung von IList an ItemsControl und nicht an IEnumerableBind IList to ItemsControl not IEnumerable

Wählen Sie das IList<T> ItemsControl IEnumerable Objektaus,wennSieeineMöglichkeithaben,eineodereineaneinObjektzubinden.IList<T>If you have a choice between binding an IList<T> or an IEnumerable to an ItemsControl object, choose the IList<T> object. Binden IEnumerable an einen ItemsControl erzwingt WPFWPF die Erstellung eines IList<T> Wrapper Objekts. Dies bedeutet, dass die Leistung durch den unnötigen Aufwand eines zweiten Objekts beeinträchtigt wird.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.

Konvertieren Sie CLR-Objekte nicht nur für die Datenbindung in XMLDo not Convert CLR objects to XML Just for Data Binding.

WPFWPFermöglicht es Ihnen, Daten an XMLXML den Inhalt zu binden, aber die XMLXML Datenbindung an den Inhalt ist langsamer als die Datenbindung an CLR-Objekte.allows you to data bind to XMLXML content; however, data binding to XMLXML content is slower than data binding to CLR objects. Konvertieren Sie CLR-Objektdaten nicht in XML, wenn der einzige Zweck für die Datenbindung besteht.Do not convert CLR object data to XML if the only purpose is for data binding.

Siehe auchSee also