2011-11-16 99 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個星期。 –