WPF数据绑定开销

8

我正在学习WPF。现在我来到了绑定的部分。当使用 INotifyPropertyChanged 时,绑定是否依赖于反射?如果是,代价是什么?我正在考虑使用WPF来显示通过UDP流传输的数据,但我担心相比WinForms,开销可能会太大。

2个回答

6
绑定性能取决于要绑定的对象类型。在解析CLR属性时,不使用反射来处理INotifyPropertyChanged。Microsoft在这方面有很好的写作:“优化性能:数据绑定”
与性能相关的关键细节:
如果源对象是CLR对象且源属性是CLR属性,则WPF数据绑定引擎首先必须对源对象使用反射...从性能角度来看,这个反射操作序列可能非常耗费时间。
解析对象引用的第二种方法涉及实现了INotifyPropertyChanged接口的CLR源对象和CLR属性的源属性。在这种情况下,数据绑定引擎直接在源类型上使用反射并获取所需属性。这仍然不是最佳方法,但比第一种方法的工作集成本要低。
解析对象引用的第三种方法涉及源对象为DependencyObject且源属性为DependencyProperty。在这种情况下,数据绑定引擎不需要使用反射。相反,属性引擎和数据绑定引擎共同独立解析属性引用。这是用于数据绑定的解析对象引用的最佳方法。
WPF允许您将数据绑定到XML内容;但是,与数据绑定到CLR对象相比,数据绑定到XML内容较慢。如果唯一目的是数据绑定,请勿将CLR对象数据转换为XML。

3
值得注意的是,只有在首次解析绑定的初始PropertyPath时才会产生这种反射开销。幕后有一个相当复杂的PropertyPathWorker缓存了绑定表达式的解析形式,这使它能够对路径中任何位置的通知更改做出反应,而无需重新进行反射以获取必要的元数据。 - Dan Bryant

6
这里有一篇关于它的MSDN文章。这是我经常听到的一个非常普遍的问题。
但是我的想法是,除非你遇到了一个严重的边缘情况,否则你应该在WPF中使用数据绑定。这是整个系统设计的方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接