在阅读文档时,似乎WPF使用反射绑定到CLR对象。在我的应用中,我将DataGrid
绑定到仅包含250个项目的IList<T>
(每个项目包含8个属性)。 DataGrid
正在使用虚拟化,因此它仅提取30个项目的属性。这些属性都是简单的字符串,但它仍需要几百毫秒,如果将它与通过复杂数据库查询生成该列表所花费的40毫秒进行比较,这种方法太长了。
是否有任何技巧可以改善绑定时间?
答案 0 :(得分:1)
所以,这是一个猜测,但它发生在我之前,它值得一试。在猜测之前,您是否已将您的代码分析为完全哪些呼叫花费的时间最多?我相信你,当你说使用绑定时,时间会急剧增加,但我要提供的建议可以通过分析结果得到证实或证实。总之...
我刚刚在一个应用程序上工作,生成了很多小的UI元素。每个元素都是UserControl
的一个实例,并使用数据绑定作为其外观。我注意到,当生成许多(200+)这些元素时,存在明显的滞后。
我们使用Prism及其ViewModelBase
类,将代理传递给RaisePropertyChanged
方法,即
private int _foo;
public int Foo
{
get { return _foo; }
set
{
if( _foo != value )
{
_foo = value;
RaisePropertyChanged( this.Foo ); // trouble
}
}
}
问题在于RaisePropertyChanged
的实现必须使用反射来将属性名称作为字符串。当很多(其中我的意思是很多)被解雇时,会有很大的性能损失。
解决方案?使用字符串而不是函数对象。是的,这真的是全部。它有点臭,因为如果你重构那个属性你必须记住改变两件事,但说实话,在许多情况下性能下降是不值得的。
无论如何,试一试。如果在RaisePropertyChanged
内花费了大量的CPU时间,那可能就是原因。