2012-04-20 232 views
0

我有繼承DataGrid(從WPFToolkit)已在它周圍的10000項我的自定義網格。內置的排序非常緩慢。因此我寫了一個單獨的類,它保持了運行排序的所有DataRowView項目爲每列(這工作,因爲從電網中添加和刪除是非常很少,如果有的話)。WPF DataGrid的自定義排序:重新排列物品的ItemsSource

該網格有AutoGenerateColumns='True',並綁定到DataTableDefaultView

我重寫了OnSorting以瞭解何時單擊列標題並嘗試用我的已排序的DataRowView列表替換網格的ItemsSource。下面是方法:

private void RefreshItems() 
    { 
     if (_updating || _multiIndexer.Count == 0) 
      return; 

     try 
     { 
      _updating = true; 
      this.AutoGenerateColumns = false; 

      // replace the itemssource with my maintained and sorted list of 
      // DataRowView items 
      this.ItemsSource = _multiIndexer.ToList(); 
     } 
     finally 
     { 
      //this.AutoGenerateColumns = true; 
      _updating = false; 
     } 
    } 

的問題是,我摧毀從自動生成存在的列。另外,我只留下了與DataRowView屬性相匹配的列。

我認爲最好的辦法是從我的DataRowView排序列表創建DataView並傳遞到ItemsSource,但我還沒有取得任何結果。

任何想法如何通過行到的ItemsSource或項目的一個新的列表而不破壞自動生成列?手動生成我的所有列不是一個選項。

乾杯, 肖恩

回答

0

我不知道的方式擺脫列的再創作。我有類似的問題,通常我使用ICollectionView和DeferRefresh。因爲您不必在實際的模型對象中執行此操作。但我不確定它是否可以和DataView一起使用,也可以和List一樣好。

0

你是什麼意思「其速度很慢」是什麼意思?

如果我採取數據網格並綁定50000row和20co​​lumns給它的數據表。它似乎快給我

視圖模型

public class Viewmodel 
{ 
    public DataTable MyData { get; set; } 

    public Viewmodel() 
    { 
     this.MyData = new DataTable(); 

     for (int i = 0; i < 20; i++) 
     { 
      this.MyData.Columns.Add("Col" + i); 
     } 

     for (int i = 0; i < 50000; i++) 
     { 
      var row = MyData.NewRow(); 
      for (int j = 0; j < 20; j++) 
      { 

       row["Col" + j] = string.Format("{0} Row, Col {1}", i, j); 
      } 
      this.MyData.Rows.Add(row); 

     } 
    } 
} 

窗口

<DataGrid ItemsSource="{Binding MyData}" AutoGenerateColumns="True"> 

    </DataGrid> 

編輯:其.net4.0

+0

只要我們開始在兩個方向上多列排序,內置在排序變得非常緩慢。我們所選擇的算法中要快4-10倍之間建立數據行顯示(與完成其自己的排序採取網格的時間,但不顯示此列表的排序列表...所以我到現在還是沒確定結果是否成立)。這就是爲什麼我需要顯示我沒有破壞或重建列的數據行列表 – 2012-04-20 13:55:35