阅读文档时,似乎WPF使用反射来绑定CLR对象。在我的应用程序中,我将一个DataGrid
绑定到仅包含250个项目(每个项目有8个属性)的IList<T>
。 DataGrid
正在使用虚拟化,所以它只能获取30个左右的属性。这些属性都是简单的字符串,并且仍然需要几百毫秒,如果将它与通过复杂数据库查询生成该列表所花费的40毫秒进行比较,则时间太长。提高绑定速度
是否有任何技巧来提高绑定时间?
阅读文档时,似乎WPF使用反射来绑定CLR对象。在我的应用程序中,我将一个DataGrid
绑定到仅包含250个项目(每个项目有8个属性)的IList<T>
。 DataGrid
正在使用虚拟化,所以它只能获取30个左右的属性。这些属性都是简单的字符串,并且仍然需要几百毫秒,如果将它与通过复杂数据库查询生成该列表所花费的40毫秒进行比较,则时间太长。提高绑定速度
是否有任何技巧来提高绑定时间?
所以,这是一个猜测,但它发生在我以前,这是值得一试。在猜测之前,你是否分析了你的代码,看看究竟是哪个调用花费最多时间?我相信你,当你说使用绑定的时候,时间会大大增加,但是我要给出的建议可以被证明或者被分析结果反驳。无论如何...
我前段时间在一个应用程序上工作,生成了很多小UI元素。每个元素都是UserControl
的一个实例,并使用数据绑定来表示它的外观。我注意到,当生成这些元素中的很多(200+)时,有一个明显的滞后。
我们使用棱镜和ViewModelBase
类,在委托传递给RaisePropertyChanged
方法,即
private int _foo;
public int Foo
{
get { return _foo; }
set
{
if(_foo != value)
{
_foo = value;
RaisePropertyChanged(this.Foo); // trouble
}
}
}
这样做的问题是,RaisePropertyChanged
的实现必须使用反射来获取属性名称为串。当很多(我的意思是很多)这些被解雇的时候,都会有明显的表现。
解决方案?使用一个字符串而不是函数对象。是的,这只是它所需要的。它有点臭,因为如果你重构了这个属性,你必须记住要改变两件事情,但老实说,在许多情况下性能降低是不值得的。
反正,给它一个镜头。如果在RaisePropertyChanged
内部花费大量CPU时间,可能原因很多。
感谢您的想法!但是,所有属性都是只读的,并且永远不会更改,因此根本不使用“PropertyChanged”。你有什么建议使用什么软件来进行分析?我尝试了一些,但是从它们中获得任何有意义的结果似乎非常复杂? – Muis
@Joshua:好吧,对不起,我没有更多的帮助。我使用Redgate的ANTS分析器获得了很好的结果。它是免费的2个星期。 –