2009-10-27 33 views
8

Bu, bir DataGrid bir sütun başlığına tıklayarak varsayılan sıralama yöntemidir. Temel listede 100.000 öğe bulunduğunda, görünümü yenilemek yaklaşık 20 saniye sürer. SortDescription s'yi CollectionView'a ayarlarken aynı gecikme gözlemlenebilir.Neden CollectionViewSource.SortDescriptions kullanarak sıralama yavaş?

ListCollectionView.CustomSort kullanarak veya sıralama ve yeniden Atama listesi neredeyse anında çalışır göre sıralama.

Neden bu gecikme? Bu sadece bağlı özelliklerde bir "yansıma vergisi" mi? Haklısınız

cevap

9

, bu bir yansımasıdır vergidir. DataGrid performansına bir süre önce çok yakından baktım ve yansıma burada bir şişe boynuydu. Sıralama algoritması ne kadar hızlı olursa olsun, iki karşılaştırma arasında mülkün değerini önbelleğe almazlar. Yani, n * ln (n) karşılaştırmalarınız olsa bile, n = 100 000 ile ~ 1 000 000 işlem elde edersiniz. Her işlenenin değer elde etmek için yansıma kullanması, bu nedenle 2 000 000 vergi beyanına yansıması :) :) ListCollectionView.CustomSort burada ideal bir çözümdür.

PS: biz DataGrid de oluşturma performansını memnun olmadıklarını çünkü günün sonunda, biz, ListView tabanlı ızgara yazdım ... Ama bu başka bir hikaye :) filtreleme için

1

iyi performans çimdik var DataGridRow Görünürlüğünü değiştiriyordu. Fark büyüklüğünde!

1. DataVirenin ItemSource kaynağını Bağladığınız Toplama Öğesine isVisible özelliğini ekleyin.

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

2.Trigger sizin IsVisible özelliğine bağlayarak DataGridRow görünürlüğü:

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

3.Well, hani ViewModel gibi çok tahmin yere IsVisible set lazım. İşte ben ne yapıyorum sadece örnek verilmektedir (sadece/yapıştır işi kopyalama) - temelde benim diğer ViewModel bazı ölçütlere göre doğru veya yanlış olarak IsVisible ayarı:

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

Bu benim için çalıştı. Benzer bir problem bu şekilde Angular içinde çözülebilir :). – Den