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 in Form von CLR-Objekten und XML an Daten aus einer Vielzahl von Datenquellen gebunden werden.Elements can be bound to data from a variety of data sources in the form of CLR objects and XML.

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 Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) einer Datenbindung kann ein beliebiges CLR-Objekt sein.The source of a Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) data binding can be any CLR object. Sie können eine Bindung an Eigenschaften, Untereigenschaften oder Indexer eines CLR-Objekts binden.You can bind to properties, sub-properties, or indexers of a CLR object. Die Bindungsverweise werden entweder mithilfe der Microsoft ICustomTypeDescriptor.NET Framework-Reflektion oder einer 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 PropertyInfo wird das Objekt verwendet, um die Attribute der Eigenschaft zu ermitteln und bietet Zugriff auf Eigenschaftenmetadaten.In this case, the PropertyInfo object is used to discover the attributes of the property and provides access to property metadata. Bei Verwendung ICustomTypeDescriptor der Schnittstelle verwendet das Datenbindungsmodul 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 in Fällen, in denen 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.

Eigenschaftenänderungsbenachrichtigungen können entweder durch INotifyPropertyChanged Implementieren der Schnittstelle oder mithilfe TypeDescriptorder Änderungsbenachrichtigungen bereitgestellt werden, die der zugeordnet sind.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 Eigenschaftenänderungsbenachrichtigungen ist jedoch die Verwendung INotifyPropertyChangedvon .However, the preferred strategy for implementing property change notifications is to use INotifyPropertyChanged.

Wenn das Quellobjekt ein CLR-Objekt ist und die Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Quelleigenschaft eine CLR-Eigenschaft ist, muss TypeDescriptordas Datenbindungsmodul PropertyDescriptorzuerst die Reflektion für das Quellobjekt verwenden, um die abrufe, und dann eine Abfrage für eine .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 Objektverweisen umfasst INotifyPropertyChanged ein CLR-Quellobjekt, das die Schnittstelle implementiert, und eine Quelleigenschaft, 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 Objektverweisen DependencyObject umfasst ein Quellobjekt, das eine und eine Quelleigenschaft ist, die eine DependencyPropertyist.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 Text Geschwindigkeit der TextBlock Datenbindung der Eigenschaft von tausend Elementen mit diesen drei Methoden.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)
Zu einer Eigenschaft eines CLR-ObjektsTo a property of a CLR object 115115 314314
An eine Eigenschaft eines CLR-Objekts, dasINotifyPropertyChangedTo a property of a CLR object which implements INotifyPropertyChanged 115115 305305
Zu DependencyProperty einem DependencyObjectvon .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 Auswirkungen minimieren, indem Sie das einzelne Objekt in mehrere CLR-Objekte mit weniger Eigenschaften unterteilen.You can minimize this impact by dividing the single object into multiple CLR objects with fewer properties. Die Tabelle zeigt die Bindungs- und Renderzeiten für die Datenbindung an ein einzelnes großes CLR-Objekt im Vergleich zu mehreren kleineren Objekten.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
An 1000 CLR-Objekte mit einer EigenschaftTo 1000 CLR objects with one property 115115 314314

Bindung an eine ItemsSourceBinding to an ItemsSource

Stellen Sie sich ein Szenario List<T> vor, in dem Sie über ein CLR-Objekt verfügen, das eine Liste der Mitarbeiter enthält, die Sie in einem ListBoxanzeigen 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 ItemsSource erstellen, ListBoxbinden Sie Ihre Mitarbeiterliste an die Eigenschaft der .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 denken, dass Sie diese Person ListBox einfach zu Ihrer Mitarbeiterliste hinzufügen und erwarten würden, dass diese Änderung automatisch vom Datenbindungsmodul erkannt wird, um diese neue Person in Ihre gebundenen Werte einzufügen.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 sich als falsch erweisen; in Wirklichkeit wird die Änderung nicht ListBox automatisch in der widergespiegelt.That assumption would prove false; in actuality, the change will not be reflected in the ListBox automatically. Dies liegt daran, dass das CLR-Objekt List<T> nicht automatisch ein Änderungsereignis für auflistungen auslöst.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 Ihre Mitarbeiterliste neu erstellen und sie ItemsSource erneut an ListBoxdie Eigenschaft des anhängen.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 ItemsSource ListBox Sie das von ListBox einem neuen Objekt neu zuweisen, wirft der Erste seine vorherigen Elemente weg und regeneriert seine gesamte 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 Auswirkungen auf die Leistung ListBox werden vergrößert, wenn Ihre Zuordnungen zu 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 ObservableCollection<T>besteht darin, Ihre Mitarbeiterliste zu einer 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 Änderungsbenachrichtigung aus, die das Datenbindungsmodul empfangen 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 es aus einem, 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 zum Aktualisieren der (wenn die ListBox UI-Virtualisierung deaktiviert ist) benötigt wird, 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 List<T> verstrichene ListBox Zeit ItemsSourcedar, zu der das CLR-Objekt an die des Elements 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 ObservableCollection<T> die verstrichene Zeit dar, zu der ein an das ListBox Element gebunden ItemsSourceist.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 ObservableCollection<T> Zeiteinsparungen mit der Datenbindungsstrategie.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 List<T> CLR-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

Wenn Sie zwischen dem IList<T> Binden IEnumerable eines ItemsControl oder eines IList<T> an ein Objekt stehen, wählen Sie das Objekt aus.If you have a choice between binding an IList<T> or an IEnumerable to an ItemsControl object, choose the IList<T> object. Bindung IEnumerable an ItemsControl WPFWPF einen Kräfte zum IList<T> Erstellen eines Wrapperobjekts, was bedeutet, dass Ihre Leistung durch den unnötigen Overhead 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 XML-Inhalte zu binden; Die Datenbindung an XML-Inhalte ist jedoch langsamer als die Datenbindung an CLR-Objekte.allows you to data bind to XML content; however, data binding to XML content is slower than data binding to CLR objects. Konvertieren Sie CLR-Objektdaten nicht in XML, wenn der einzige Zweck die Datenbindung ist.Do not convert CLR object data to XML if the only purpose is for data binding.

Weitere InformationenSee also