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 CLRCLR-Objekten und XMLXML gebunden werden.Elements can be bound to data from a variety of data sources in the form of CLRCLR 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.

Die Quelle eine Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)-Datenbindung kann jedes CLRCLR-Objekt sein.The source of a Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) data binding can be any CLRCLR object. Sie können an Eigenschaften, Untereigenschaften oder Indexer eines CLRCLR-Objekts binden.You can bind to properties, sub-properties, or indexers of a CLRCLR object. Mithilfe der beiden Microsoft .NET Framework-Reflektion Bindungsverweise aufgelöst werden oder ein ICustomTypeDescriptor.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 die PropertyInfo Objekt wird verwendet, um die Attribute der Eigenschaft ermitteln und ermöglicht den Zugriff auf Metadaten.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, die Datenbindungs-Engine verwendet diese Schnittstelle für 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 hilfreich in Fällen, in dem das Objekt keinen statischen Satz von Eigenschaften.The ICustomTypeDescriptor interface is especially useful in cases where the object does not have a static set of properties.

Benachrichtigungen über eigenschaftsänderungen können angegeben werden, entweder durch die Implementierung der INotifyPropertyChanged Schnittstelle oder die zugeordnete änderungsbenachrichtigungen mit der TypeDescriptor.Property change notifications can be provided either by implementing the INotifyPropertyChanged interface or by using the change notifications associated with the TypeDescriptor. Die geeignetere Strategie zum Implementieren von Benachrichtigungen über eigenschaftsänderungen jedoch ist die Verwendung INotifyPropertyChanged.However, the preferred strategy for implementing property change notifications is to use INotifyPropertyChanged.

Wenn das Quellobjekt ein CLRCLR Objekt und die Quelleigenschaft ist ein CLRCLR -Eigenschaft, die Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Datenbindungs-Engine muss zuerst für das Quellobjekt mithilfe der Reflektion erhalten die TypeDescriptor, und dann Abfragen für eine 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. 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.

Zum Auflösen von Objektverweisen der zweiten Methode werden eine CLRCLR Quellobjekt, das implementiert, die INotifyPropertyChanged Schnittstelle und eine Quelleigenschaft, die eine CLRCLR Eigenschaft.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 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 Objektverweisen involviert ein Quellobjekt, das eine DependencyObject und eine Quelleigenschaft, die eine 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 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.

Die folgende Tabelle vergleicht die Geschwindigkeit der Datenbindung die Text -Eigenschaft von Tausend TextBlock Elemente, die diese drei Methoden verwenden.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 die Eigenschaft eines CLRCLR-ObjektsTo a property of a CLRCLR object 115115 314314
An eine Eigenschaft einer CLRCLR Objekts, das implementiert INotifyPropertyChangedTo a property of a CLRCLR object which implements INotifyPropertyChanged 115115 305305
Um eine DependencyProperty von einem DependencyObject.To a DependencyProperty of a DependencyObject. 9090 263263

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

Wenn Sie Daten an ein einzelnes CLRCLR-Objekt mit tausend Eigenschaften binden, beeinträchtigt dies die Leistung deutlich.There is a significant performance impact when you data bind to a single CLRCLR object with thousands of properties. Sie können die Beeinträchtigung verringern, indem Sie das einzelne Objekt in mehrere CLRCLR-Objekte aufteilen, die weniger Eigenschaften haben.You can minimize this impact by dividing the single object into multiple CLRCLR objects with fewer properties. In der unten stehenden Tabelle werden die Bindungs- und Renderingzeiten für die Datenbindung an ein einzelnes großes CLRCLR-Objekt und an mehrere kleinere Objekte dargestellt.The table shows the binding and rendering times for data binding to a single large CLRCLR 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)
An ein CLRCLR-Objekt mit 1000 EigenschaftenTo a CLRCLR object with 1000 properties 950950 12001200
An 1000 CLRCLR-Objekte mit einer EigenschaftTo 1000 CLRCLR objects with one property 115115 314314

Bindung an eine ItemsSourceBinding to an ItemsSource

Betrachten Sie ein Szenario, in dem Sie besitzen, eine CLRCLR List<T> -Objekt, das eine Liste der Mitarbeiter, die enthält in angezeigt werden soll eine 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. Um eine Entsprechung zwischen diesen beiden Objekten zu erstellen, binden Sie Ihre Angestelltenliste an die ItemsSource Eigenschaft der ListBox.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. Sie könnten meinen, dass um diese neue Person in die gebundenen einfügen ListBox Werte, Sie würden einfach diese Person Angestelltenliste hinzufügen und erwarten, dass diese Änderung automatisch von der Datenbindungs-Engine erkannt werden.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 als falsch herausstellen; in Wirklichkeit, der keine Änderung der ListBox automatisch.That assumption would prove false; in actuality, the change will not be reflected in the ListBox automatically. Grund hierfür ist die CLRCLR List<T> Objekt wird nicht automatisch ein CollectionChanged-Ereignis auslöst.This is because the CLRCLR List<T> object does not automatically raise a collection changed event. Zum Abrufen der ListBox um die Änderungen zu übernehmen, müssen neu von der Liste mit Mitarbeitern, und fügen Sie es erneut die ItemsSource Eigenschaft der 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. Obwohl diese Lösung funktioniert, beeinträchtigt sie die Leistung deutlich.While this solution works, it introduces a huge performance impact. Jedes Mal, die Sie neu zuweisen der ItemsSource von ListBox auf ein neues Objekt, das ListBox zunächst die bisherigen Elemente und generiert seine komplette Liste.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 leistungsbeeinträchtigung wird noch vergrößert, wenn Ihre ListBox ordnet einem komplexen DataTemplate.The performance impact is magnified if your ListBox maps to a complex DataTemplate.

Eine sehr effiziente Lösung für dieses Problem ist, stellen Ihre Angestelltenliste ein ObservableCollection<T>.A very efficient solution to this problem is to make your employee list an ObservableCollection<T>. Ein ObservableCollection<T> -Objekt löst eine änderungsbenachrichtigung aus, die die Datenbindungs-Engine empfangen kann.An ObservableCollection<T> object raises a change notification which the data binding engine can receive. Das Ereignis hinzugefügt oder entfernt ein Element aus einer ItemsControl ohne die gesamte Liste erneut generieren.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 zum Aktualisieren der ListBox (mit UI-Virtualisierung deaktiviert.) 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 Anzahl in der ersten Zeile gibt die verstrichene Zeit bei der CLRCLR List<T> -Objekt gebunden ist ListBox des Elements ItemsSource.The number in the first row represents the elapsed time when the CLRCLR List<T> object is bound to ListBox element's ItemsSource. Die Anzahl in der zweiten Zeile darstellt, die verstrichene Zeit beim ein ObservableCollection<T> gebunden ist die ListBox des Elements ItemsSource.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 erhebliche einsparungen mithilfe der ObservableCollection<T> Strategie für die Bindung von Daten.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)
Um eine CLRCLR List<T> ObjektTo a CLRCLR List<T> object 16561656
Um eine ObservableCollection<T>To an ObservableCollection<T> 2020

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

Wenn Sie die Wahl zwischen der Bindung haben ein IList<T> oder ein IEnumerable zu ein ItemsControl Objekt, wählen Sie die IList<T> Objekt.If you have a choice between binding an IList<T> or an IEnumerable to an ItemsControl object, choose the IList<T> object. Binden von IEnumerable auf eine ItemsControl erzwingt, dass WPFWPF Erstellen eines Wrappers IList<T> -Objekt, das bedeutet, dass die Leistung wird durch den unnötigen Mehraufwand eines zweiten Objekts beeinträchtigt.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.

Mit WPFWPF können Sie eine Datenbindung an XMLXML-Inhalt durchführen; allerdings ist die Datenbindung an XMLXML-Inhalt langsamer als an CLRCLR-Objekte.WPFWPF allows you to data bind to XMLXML content; however, data binding to XMLXML content is slower than data binding to CLRCLR objects. Konvertieren Sie CLRCLR-Objektdaten nicht nur für die Datenbindung in XML.Do not convert CLRCLR object data to XML if the only purpose is for data binding.

Siehe auchSee also