2012-05-02 51 views
3

我有一個WPF數據網格,綁定到linq-to-sql從數據庫中填充的列表。的結合是雙向的,從而允許當列表的初始化期間與存儲器外的異常顯示關於20000行,則程序崩潰用戶改變每一行如何懶評估wpf:DataGrid,只根據需要檢索數據

 <wpf:DataGrid AutoGenerateColumns="False" 
       ItemsSource="{Binding MyList}" 
       SelectedItem="{Binding SelectedItem}" > 

中的值。即使行數較少,性能也變得難以忍受。

我知道在初始化時,datagrid遍歷每一行來測量最大列寬和其他屬性。無論是否在屏幕上,它顯然都會這樣做。

我嘗試綁定數據網格到myQuery.ToList()(允許通過單擊列對數據網格進行排序)或直接綁定到IQueryable。 (排序不適用於此)

兩者都產生相同的結果。單獨使用20000個項目的ToList()不會導致大量內存消耗,只有在綁定到數據網格時纔會發生這種情況。

忽略數據網格中20000行有用的問題(這些是當前需求;改變這些工作示例會有幫助)。

什麼是最簡單的方式來懶惰地加載當前顯示在屏幕上的數據,並忽略其他所有內容,直到它滾動到視圖中?

這可以在沒有第三方庫和主要代碼更改的情況下完成嗎?

如果不是,建議的解決方法是什麼?

+0

你需要DataGrid中? DataGrid是一個豬。 ListView Gridview將一部分資源用作DataGrid。你給DataGrid一個*高度,因爲如果是的話,它不會虛擬化。確保你得到一個垂直滾動條,並去GridView。 – Paparazzi

+0

@Blam不知道如果我需要DataGrid,但根據[這個答案](http://stackoverflow.com/a/4766730/145999)和[這個答案](http://stackoverflow.com/a/1006507/ 145999)Datagrid將是默認選擇,因爲我想編輯和排序。我需要設置什麼樣的身高?我得到一個滾動條。 – HugoRune

+0

使用GridView你需要實現排序,但並不難。 GridView不支持編輯。我所做的是在右側有一個編輯細節,他們可以編輯選定的行。用戶喜歡速度(而不是鎖定)。 – Paparazzi

回答

4

事實證明,這個問題完全是用戶的錯誤在我的部分:

WPF的Datagrid可以做UI虛擬化就好了:耗費行對象的存儲需要時只繪製;如果一行在數據網格的可見邊界之外,它將不會被實例化。

但是,如果datagrid包含在ScrollViewer中,這將不起作用。 在scrollviewer中,datagrid的每個部分都是可見的,所以整個datagrid都會被渲染。 scrollviewer然後只顯示適合UI窗口內的這個呈現的數據網格的一部分。

由於scrollviewer中的datagrid看起來就像管理自己的滾動條的datagrid,所以我沒有注意到scrollviewer。

隨着scrollviewer被刪除,大量的行根本沒有問題,即使在可變的高度和寬度。 datagrid只是填充可用空間,並且只根據需要實例化新行。

因此,在短期,我的問題將溶液:不要把一個DataGrid中的ScrollViewer

0

,你是在這個他的情況下結合的特性,讓我們說你的MyList由MyFile的對象(List<MyFile>),那麼你必須創建MyFile的類如:

class MyFile 
    { 
     public string FullPath { get; set; } 

     public string Extension 
     { 
      get 
      { 
       return Path.GetExtension(FullPath); 
      } 
     } 

     public string PathRoot 
     { 
      get 
      { 
       return Path.GetPathRoot(FullPath); 
      } 
     } 

     public DateTime CreationTime 
     { 
      get 
      { 
       return File.GetCreationTime(FullPath); 
      } 
     } 

    } 

這樣,你將存儲每個對象中包含更少的信息,並且只需在網格中顯示的少數項目上調用get方法。與存儲在課堂中的實際值相比。希望這有助於

+0

正如我所說的,列表本身可以毫無問題地適應內存。內存消耗僅在綁定到數據網格時發生。據我所知,因爲datagrid會在初始化時檢索每一行並檢索並存儲呈現信息。因此,在每個對象中存儲較少的內容不會改變任何東西 – HugoRune

+0

您用我展示的技術不會存儲更少的內容。您將在網格中顯示時加載所需的內容。這項技術應該顯着提高網格的性能。 –