Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Windows Presentation Foundation (WPF) data binding provides a simple and consistent way for applications to present and interact with data. Elements can be bound to data from a variety of data sources in the form of CLR objects and XML.
This topic provides data binding performance recommendations.
How Data Binding References are Resolved
Before discussing data binding performance issues, it is worthwhile to explore how the Windows Presentation Foundation (WPF) data binding engine resolves object references for binding.
The source of a Windows Presentation Foundation (WPF) data binding can be any CLR object. You can bind to properties, sub-properties, or indexers of a CLR object. The binding references are resolved by using either Microsoft .NET Framework reflection or an ICustomTypeDescriptor. Here are three methods for resolving object references for binding.
The first method involves using reflection. In this case, the PropertyInfo object is used to discover the attributes of the property and provides access to property metadata. When using the ICustomTypeDescriptor interface, the data binding engine uses this interface to access the property values. The ICustomTypeDescriptor interface is especially useful in cases where the object does not have a static set of properties.
Property change notifications can be provided either by implementing the INotifyPropertyChanged interface or by using the change notifications associated with the TypeDescriptor. However, the preferred strategy for implementing property change notifications is to use INotifyPropertyChanged.
If the source object is a CLR object and the source property is a CLR property, the 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. This sequence of reflection operations is potentially very time-consuming from a performance perspective.
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 this case, the data binding engine uses reflection directly on the source type and gets the required property. This is still not the optimal method, but it will cost less in working set requirements than the first method.
The third method for resolving object references involves a source object that is a DependencyObject and a source property that is a DependencyProperty. In this case, the data binding engine does not need to use reflection. Instead, the property engine and the data binding engine together resolve the property reference independently. This is the optimal method for resolving object references used for data binding.
The table below compares the speed of data binding the Text property of one thousand TextBlock elements using these three methods.
| Binding the Text property of a TextBlock | Binding time (ms) | Render time -- includes binding (ms) |
|---|---|---|
| To a property of a CLR object | 115 | 314 |
| To a property of a CLR object which implements INotifyPropertyChanged | 115 | 305 |
| To a DependencyProperty of a DependencyObject. | 90 | 263 |
Binding to Large CLR Objects
There is a significant performance impact when you data bind to a single CLR object with thousands of properties. You can minimize this impact by dividing the single object into multiple CLR objects with fewer properties. The table shows the binding and rendering times for data binding to a single large CLR object versus multiple smaller objects.
| Data binding 1000 TextBlock objects | Binding time (ms) | Render time -- includes binding (ms) |
|---|---|---|
| To a CLR object with 1000 properties | 950 | 1200 |
| To 1000 CLR objects with one property | 115 | 314 |
Binding to an ItemsSource
Consider a scenario in which you have a CLR List
A very efficient solution to this problem is to make your employee list an ObservableCollection
The table below shows the time it takes to update the ListBox (with UI virtualization turned off) when one item is added. The number in the first row represents the elapsed time when the CLR List
| Data binding the ItemsSource | Update time for 1 item (ms) |
|---|---|
| To a CLR List |
1656 |
| To an ObservableCollection |
20 |
Bind IList to ItemsControl not IEnumerable
If you have a choice between binding an IList
Do not Convert CLR objects to XML Just for Data Binding.
WPF allows you to data bind to XML content; however, data binding to XML content is slower than data binding to CLR objects. Do not convert CLR object data to XML if the only purpose is for data binding.
See also
- Optimizing WPF Application Performance
- Planning for Application Performance
- Taking Advantage of Hardware
- Layout and Design
- 2D Graphics and Imaging
- Object Behavior
- Application Resources
- Text
- Other Performance Recommendations
- Data Binding Overview
- Walkthrough: Caching Application Data in a WPF Application
.NET Desktop feedback