2009-10-27 104 views
8

這是在DataGrid中單擊列標題時的默認排序方法。當底層列表包含100,000個項目時,刷新視圖需要大約20秒。在CollectionView上設置SortDescription時,可以觀察到同樣的延遲。爲什麼使用CollectionViewSource.SortDescriptions進行排序很慢?

使用ListCollectionView.CustomSort進行排序或者通過對列表工作進行排序和重新分配幾乎可以立即進行。

爲什麼這個延遲?這僅僅是對綁定屬性的「反映稅」?

回答

9

你說得對,這是反映稅。我前段時間非常關注DataGrid的性能,反思在這裏是一個瓶頸。無論排序算法有多快,它們都不會在兩次比較之間緩存屬性值。所以,即使你有n * ln(n)的比較,n == 100 000,你會得到〜1 000 000次操作。每個操作數使用反射來獲得價值,所以你有2 000 000個電話來反思稅收:) :) ListCollectionView.CustomSort是理想的解決方案。

PS:在這一天結束時,我們寫了一個基於ListView的電網,因爲我們是不滿意的DataGrid渲染性能太...但這是另一個故事:)

1

最佳性能的調整進行過濾,切換DataGridRow可見性。它取得了巨大的差異!

1.將IsVisible屬性添加到將DataGrid的ItemSource綁定到的Collection Item。

private bool _isVisible = true; 
public bool IsVisible 
{ 
    get { return _isVisible; } 
    set 
    { 
     if (_isVisible == value) 
      return; 
     _isVisible = value; 
     RaisePropertyChanged(()=>IsVisible); 
    } 
} 

2.Trigger DataGridRow通過其綁定到你的IsVisible屬性的可見性:

<DataGrid.ItemContainerStyle> 
<Style TargetType="{x:Type DataGridRow}"> 
    <Setter Property="Visibility" 
       Value="{Binding Path=IsVisible, 
           Converter={StaticResource BoolToVisibility}}"/> 
</Style> 
</DataGrid.ItemContainerStyle> 

3.Well,你得設置ISVISIBLE地方我猜過,就像在你的ViewModel。這裏只是一個我在做什麼樣(只是複製/粘貼的工作) - 根據我在其他的ViewModel一些標準ISVISIBLE基本設置爲true或false:

FilterViewModel.OnFilter += (s, a) => 
{ 
    foreach (Row row in ViewModel.Rows) 
    row.IsVisible = !FilterViewModel.FilteringItems.Any(item => 
            item.IsSelected && item.Name == row.Name); 
}; 
+0

這爲我工作。這是一個類似的問題可以通過這種方式在Angular中解決:)。 – Den 2016-01-07 17:53:24