2009-10-27 12 views
8

जब आप DataGrid में कॉलम हेडर पर क्लिक करते हैं तो यह डिफ़ॉल्ट सॉर्ट विधि है। जब अंतर्निहित सूची में 100,000 आइटम होते हैं, तो दृश्य को रीफ्रेश करने में लगभग 20 सेकंड लगते हैं। CollectionView पर SortDescription एस सेट करते समय वही देरी देखी जा सकती है।क्यों संग्रहViewSource.SortDescriptions का उपयोग कर सॉर्टिंग धीमा है?

ListCollectionView.CustomSort का उपयोग करके सॉर्टिंग या सूची को क्रमबद्ध और पुन: assinging लगभग तुरंत काम करता है।

यह देरी क्यों है? क्या यह बाध्य गुणों पर सिर्फ "प्रतिबिंब कर" है?

उत्तर

9

आप सही हैं, यह एक प्रतिबिंब कर है। मैंने कुछ समय पहले डेटाग्रिड प्रदर्शन पर बहुत बारीकी से देखा, और प्रतिबिंब यहां एक बोतल गर्दन थी। इससे कोई फर्क नहीं पड़ता कि एल्गोरिदम को कितना तेज़ कर रहा है, वे दो तुलनाओं के बीच संपत्ति के मूल्य को कैश नहीं करते हैं। तो, भले ही आपके पास एन * एलएन (एन) तुलना है, एन == 100 000 के साथ आपको ~ 1 000 000 ऑपरेशन मिलेगा। प्रत्येक ऑपरेंड मूल्य प्राप्त करने के लिए प्रतिबिंब का उपयोग करता है, इसलिए आपके पास टैक्स में प्रतिबिंब के लिए 2 000 000 कॉल हैं :) ... ListCollectionView.CustomSort यहां आदर्श समाधान है।

पुनश्च: दिन के अंत में, हम ListView आधारित ग्रिड, लिखा था क्योंकि हम डेटा ग्रिड भी प्रदर्शन प्रतिपादन से संतुष्ट नहीं थे ... लेकिन है कि एक और कहानी :)

1
छानने के लिए

सबसे अच्छा प्रदर्शन ट्वीक है, DataGridRow दृश्यता को टॉगल कर रहा था। यह अंतर की परिमाण बना दिया!

1. संग्रह आइटम में अविश्वसनीय संपत्ति जोड़ें जिसे आप डेटाग्रिड के आइटम स्रोत से जोड़ते हैं।

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

2.Trigger अपने IsVisible संपत्ति के लिए यह बाध्यकारी द्वारा DataGridRow की दृश्यता:

<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 की स्थापना:

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

यह मेरे लिए काम किया। इस तरह एंगुलर में जिस तरह से एक ही समस्या हल हो सकती है :)। – Den

संबंधित मुद्दे