Optimizing Performance: Data Binding(zz)
Optimizing Performance: Data Binding
.NET Framework 4.5
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.
This topic contains the following sections.
- How Data Binding References are Resolved
- Binding to Large CLR Objects
- Binding to an ItemsSource
- Bind IList to ItemsControl not IEnumerable
- Do not Convert CLR objects to XML Just for Data Binding.
- Related Topics
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 aPropertyDescriptor. 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
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
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. To create a correspondence between these two objects, you would bind your employee list to the ItemsSourceproperty of the ListBox. However, suppose you have a new employee joining your group. 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. That assumption would prove false; in actuality, the change will not be reflected in the ListBox automatically. This is because the CLR List<T> object does not automatically raise a collection changed event. 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. While this solution works, it introduces a huge performance impact. 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. The performance impact is magnified if your ListBox maps to a complex DataTemplate.
A very efficient solution to this problem is to make your employee list an ObservableCollection<T>. An ObservableCollection<T> object raises a change notification which the data binding engine can receive. The event adds or removes an item from an ItemsControl without the need to regenerate the entire list.
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<T> object is bound to ListBox element'sItemsSource. The number in the second row represents the elapsed time when an ObservableCollection<T> is bound to the ListBox element's ItemsSource. Note the significant time savings using the ObservableCollection<T> data binding strategy.
Data binding the ItemsSource
Update time for 1 item (ms)
To a CLR List<T> object
1656
To an ObservableCollection<T>
20
Bind IList to ItemsControl not IEnumerable
If you have a choice between binding an IList<T> or an IEnumerable to an ItemsControl object, choose the IList<T> object. Binding IEnumerable to an ItemsControl forces WPF to create a wrapper IList<T> object, which means your performance is impacted by the unnecessary overhead of a second object.
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.
Optimizing Performance: Data Binding(zz)的更多相关文章
- Data Binding使用技巧
Data Binding 根据变量,自动赋值到各widget. How 1.编写layout文件,这里的layout为: act_data_bind_demo.xml 这里需要先准备变量 在具体的wi ...
- Data Binding和INotifyPropertyChanged是如何协调工作的?
前言 WPF的一大基础就是Data Binding.在基于MVVM架构的基础上,只有通过实现INotifyPropertyChanged接口的ViewModel才能够用于Data Binding. 要 ...
- WPF QuickStart系列之数据绑定(Data Binding)
这篇博客将展示WPF DataBinding的内容. 首先看一下WPF Data Binding的概览, Binding Source可以是任意的CLR对象,或者XML文件等,Binding Targ ...
- XAML数据绑定(Data Binding)
XAML数据绑定(Data Binding) Data Binding可以使得XAML标签属性的赋值更为灵活和方便.在绑定过程中,获取数据的标签成为目标标签:提供数据的标签成为源标签.在XAML中 ...
- .NET: WPF Data Binding
WPF是分离UI和Logic的最佳工具,不同于Window Form的事件驱动原理,WPF采用的是数据驱动,让UI成为了Logic的附属,达到分离的效果. 本篇主要讲讲wpf的精华:data bind ...
- WP8.1 Study5:Data binding数据绑定
一.数据绑定 最简单的编程UI控件的方法是写自己的数据来获取和设置控件的属性,e.g. , textBox1.Text = "Hello, world"; 但在复杂的应用程序,这样 ...
- Data Binding in WPF
http://msdn.microsoft.com/en-us/magazine/cc163299.aspx#S1 Data Binding in WPF John Papa Code downl ...
- Data Binding(数据绑定)用户指南
1)介绍 这篇文章介绍了如何使用Data Binding库来写声明的layouts文件,并且用最少的代码来绑定你的app逻辑和layouts文件. Data Binding库不仅灵活而且广泛兼容- 它 ...
- 完全掌握Android Data Binding
转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0603/2992.html 来源 https://github.com/L ...
随机推荐
- shell之数值运算
Shell中声明变量默认是字符串, 要参与数值运算,可使用下面方式,简单,表示以数值方式.
- 1.4 算法 - algorithm
1)概述 2)示例 //algorithm find演示 #include <vector> #include <algorithm> #include <iostrea ...
- JDK、Jmeter、Android环境变量配置
JDK环境变量 1.在系统变量里点击新建,变量名填写JAVA_HOME,变量值填写JDK的安装路径,在这里就填写"D:\Program Files\Java\jdk1.6.0_26" ...
- Android Attr -- Understanding Android Custom Attributes
原文:http://androidbook.com/item/4169
- 昨天一日和彭讨论post请求数据的问题
上午写了一个for循环,下午与同学视频才知道没有解决根本问题,接口是url单个的数据请求,而导入的是多个员工的考勤数据也就是要有多个请求同时发出,利用这个做法是有链接超时的情况,所以昨天晚上彭为了导入 ...
- WebService - 怎样提高WebService性能 大数据量网络传输处理
直接返回DataSet对象 返回DataSet对象用Binary序列化后的字节数组 返回DataSetSurrogate对象用Binary序列化后的字节数组 返回DataSetSurrogate对象用 ...
- ***LINUX添加PHP环境变量:CentOS下将php和mysql命令加入到环境变量中
CentOS系统下如何将PHP和mysql命令加入到环境变量中,在Linux CentOS系统上 安装完php和MySQL后,为了使用方便,需要将php和mysql命令加到系统命令中,如果在没有添加到 ...
- maven pom.xml 说明
本文复制于:http://blog.csdn.net/zhuxinhua/article/details/5788546 一.pom.xml示例 <project> <modelVe ...
- js判断访问的当前设备是手机还是电脑
function browserRedirect() { var sUserAgent = navigator.userAgent.toLowerCase(); var bIsIpad = sUser ...
- poj 2337 欧拉回路输出最小字典序路径 ***
把26个小写字母当成点,每个单词就是一条边. 然后就是求欧拉路径. #include<cstdio> #include<iostream> #include<algori ...