2011-11-16 100 views
1

阅读文档时,似乎WPF使用反射来绑定CLR对象。在我的应用程序中,我将一个DataGrid绑定到仅包含250个项目(每个项目有8个属性)的IList<T>DataGrid正在使用虚拟化,所以它只能获取30个左右的属性。这些属性都是简单的字符串,并且仍然需要几百毫秒,如果将它与通过复杂数据库查询生成该列表所花费的40毫秒进行比较,则时间太长。提高绑定速度

是否有任何技巧来提高绑定时间?

回答

1

所以,这是一个猜测,但它发生在我以前,这是值得一试。在猜测之前,你是否分析了你的代码,看看究竟是哪个调用花费最多时间?我相信你,当你说使用绑定的时候,时间会大大增加,但是我要给出的建议可以被证明或者被分析结果反驳。无论如何...

我前段时间在一个应用程序上工作,生成了很多小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时间,可能原因很多。

+0

感谢您的想法!但是,所有属性都是只读的,并且永远不会更改,因此根本不使用“PropertyChanged”。你有什么建议使用什么软件来进行分析?我尝试了一些,但是从它们中获得任何有意义的结果似乎非常复杂? – Muis

+0

@Joshua:好吧,对不起,我没有更多的帮助。我使用Redgate的ANTS分析器获得了很好的结果。它是免费的2个星期。 –