提高绑定速度

时间:2011-11-16 22:45:44

标签: wpf performance reflection binding clr

在阅读文档时,似乎WPF使用反射绑定到CLR对象。在我的应用中,我将DataGrid绑定到仅包含250个项目的IList<T>(每个项目包含8个属性)。 DataGrid正在使用虚拟化,因此它仅提取30个项目的属性。这些属性都是简单的字符串,但它仍需要几百毫秒,如果将它与通过复杂数据库查询生成该列表所花费的40毫秒进行比较,这种方法太长了。

是否有任何技巧可以改善绑定时间?

1 个答案:

答案 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时间,那可能就是原因。