WPF绑定开销

kas*_*rhj 8 wpf binding

我正在学习WPF.我现在已经达成了约束力.使用时绑定是否依赖于反射INotifyPropertyChanged,是这样,价格是多少?我正在考虑使用WPF显示通过UDP流式传输的数据,但我担心与WinForms相比,开销可能太大了.

Cod*_*ked 6

绑定的性能取决于绑定的对象的类型.对于INotifyPropertyChanged,不使用反射,而是在解析CLR属性时使用.

微软对此有一个很好的写作:"优化性能:数据绑定".

与绩效相关的关键细节:

如果源对象是CLR对象并且source属性是CLR属性,则Windows Presentation Foundation(WPF)数据绑定引擎必须首先对源对象使用反射... 这一系列的反射操作可能非常耗时 从绩效角度来看.

解析对象引用的第二种方法涉及实现INotifyPropertyChanged接口的CLR源对象和作为CLR属性的source属性.在这种情况下,数据绑定引擎直接在源类型上使用反射并获取所需的属性.这仍然不是最佳方法,但 工作集要求的成本要低于第一种方法.

解析对象引用的第三种方法涉及一个源对象,它是一个DependencyObject,一个源属性是DependencyProperty.在这种情况下,数据绑定引擎不需要使用反射.相反,属性引擎和数据绑定引擎一起独立地解析属性引用. 这是解析用于数据绑定的对象引用的最佳方法.

...

WPF允许您将数据绑定到XML内容; 但是,绑定到XML内容的数据比绑定到CLR对象的数据.如果唯一目的是数据绑定,请不要将CLR对象数据转换为XML.

(重点补充)

  • 值得注意的是,只有在您首次解析Binding的初始PropertyPath时才会产生这种反射开销.在幕后有一个相当复杂的PropertyPathWorker,它以绑定的形式缓存绑定表达式,这允许它对路径中任何位置的通知更改做出反应,而无需重新反射以获取必要的元数据. (3认同)

Tim*_*Tim 6

这是一篇关于它的MSDN文章.这是我一直听到的一个非常常见的问题.

但我的想法是,除非你遇到严重的边缘情况,否则你想在WPF中使用绑定.这就是整个系统的设计方式.