WPF

2009-10-26 14 views
24

में डेटाग्रिड को प्री-सॉर्ट करना मेरे पास नाम कॉलम समेत कई स्तंभों के साथ WPF ऐप में DataGrid है। यदि उपयोगकर्ता किसी विशेष दृश्य पर स्विच करते हैं, तो मैं चाहता हूं कि डेटा नाम से पूर्व-क्रमबद्ध हो (और मैं नाम शीर्षलेख में एक प्रकार का तीर दिखाना चाहता हूं जैसे उपयोगकर्ता ने उस शीर्षलेख पर क्लिक किया था)। हालांकि, मुझे ऐसा होने के लिए अपेक्षित गुण नहीं मिल रहे हैं। मैं SortColumn, SortColumnIndex, SortDirection की तरह कुछ के लिए देख रहा था, आदिWPF

यह डिफ़ॉल्ट सॉर्ट स्तंभ और मार्कअप (XAML) में दिशा निर्दिष्ट करने के लिए संभव है या कर रहा है WPF टूलकिट DataGrid द्वारा समर्थित नहीं है?

+0

WPF के बाद में बनाया गया एक डेटा ग्रिड के साथ नहीं आता, तो हम आपको डेटा ग्रिड कि WPF टूलकिट के साथ आता है की चर्चा करते हुए कर रहे हैं मान सकते हैं (http://www.codeplex.com/wpf) ??? –

+0

हां, मैंने wpftoolkit टैग डाला, लेकिन मुझे लगता है कि मैंने इसे अपने प्रश्न में उल्लेख नहीं किया है। मैं इसे जोड़ दूंगा। – devuxer

उत्तर

38

मान लें कि आप WPF टूलकिट डेटाग्रिड नियंत्रण के बारे में बात कर रहे हैं, आपको केवल the CanUserSortColumns property को सत्य पर सेट करने की आवश्यकता है और फिर डेटाग्रिड में प्रत्येक डेटाग्रिड कॉलम के the SortMemberPath property सेट करें।

प्रारंभ में संग्रह को सॉर्ट करने के लिए, आपको संग्रहव्यूसोर्स का उपयोग करना होगा और उस पर सॉर्ट सेट करना होगा और फिर उसे अपने डेटाग्रिड के आइटमसोर्स के रूप में असाइन करना होगा।

<Window.Resources> 
    <CollectionViewSource x:Key="MyItemsViewSource" Source="{Binding MyItems}"> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription PropertyName="MyPropertyName"/> 
     </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 
</Window.Resources> 

<DataGrid ItemsSource="{StaticResource MyItemsViewSource}"> 

</DataGrid> 

नोट:: "SCM" नामस्थान उपसर्ग नक्शे System.ComponentModel के लिए जहां SortDescription वर्ग जीवन आप XAML में यह कर रहे हैं तो यह उतना ही आसान होगा।

xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" 

संपादित करें: मुझे लगता है कि पर्याप्त लोग, इस पोस्ट से मदद मिली है कि इस upvoted टिप्पणी इस जवाब में शामिल किया जाना चाहिए:

मैं इस का उपयोग करने के पाने के लिए था यह काम करने के लिए:

<DataGrid ItemsSource="{Binding Source={StaticResource MyItemsViewSource}}"> 
+0

@ ड्रू, धन्यवाद, लेकिन 'SortMemberPath' बस निर्दिष्ट करता है कि डेटा स्रोत में कौन सा फ़ील्ड डेटाग्रिड में कौन सा कॉलम है। मुझे * वर्तमान * सॉर्ट कॉलम (और दिशा) सेट करने की आवश्यकता है। उदाहरण के लिए, यह डेटाग्रिड वर्तमान में नाम से आरोही क्रमबद्ध है। – devuxer

+1

ठीक है कि आप "हेडर कॉलम पर क्लिक करके और सॉर्टिंग समस्या" को कैसे हल करते हैं। मैंने गलती से ग्रिड को सॉर्ट करने के तरीके को छोड़ दिया, मैं अब अपने जवाब में जोड़ दूंगा। –

+5

हां :) यह जो कुछ मैं ढूंढ रहा था उसके करीब है, धन्यवाद। एकमात्र समस्या यह है कि सॉर्ट तीर कॉलम के शीर्षलेख में दिखाई नहीं देता है, जिसकी तालिका क्रमबद्ध होती है। मैं इसके साथ रह सकता हूं, लेकिन एक तीर उपयोगकर्ता को थोड़ा स्पष्ट कर देगा कि सॉर्ट कॉलम क्या है। ऐसा करने का प्रयास करने वाले किसी भी व्यक्ति के लिए बस एक नोट, आपको 'System.ComponentModel' का उपयोग करने के लिए 'विंडोजबेस' के संदर्भ की आवश्यकता है। एक बार जब आप संदर्भ जोड़ लेंगे, तो आपको इसकी आवश्यकता होगी: 'xmlns: scm = "clr-namespace: System.ComponentModel; असेंबली = विंडोजबेस" '। – devuxer

2

जब आप ItemsSource doesn't support CollectionViewSource अपवाद देखते हैं, आप Linq से संग्रह सॉर्ट कर सकते हैं इससे पहले कि आप एक डेटा ग्रिड का संदर्भ लें:

ObservableCollection<MyDataClass> myCollection = new ObservableCollection<MyDataClass>(); 
dataGrid.ItemsSource = from item in myCollection orderby item select item; 

आप को लागू करना IComparable इंटरफ़ेस MyDataClass रहे हैं:

public class MyDataClass : IComparable<MyDataClass> { 
    public int CompareTo(Classified other) { 
     return other.Value.CompareTo(this.Value); // DESC 
     return this.Value.CompareTo(other.Value); // ASC 
    } 
} 
+0

यह वास्तव में मेरे लिए काम करता था क्योंकि मैं लैम्ब्डा का उपयोग करके बाइंडलिंगलिस्ट को ऑर्डर करने का प्रयास कर रहा था। यह काम किया, Lambda नहीं किया था! – DerpyNerd

4

जब आप देखते हैं ItemsSource CollectionViewSource अपवाद का समर्थन नहीं करता तो आप इस तरह {बाइंडिंग} के रूप में 'MyItemsViewSource' और ItemsSource के रूप में डेटा ग्रिड के DataContext सेट कर सकते हैं :

<DataGrid DataContext="{StaticResource MyItemsViewSource}" ItemsSource="{Binding}"> 
</DataGrid> 
+1

मैं इस पोस्ट पर वापस आ रहा हूं (इस साल तीसरी बार) क्योंकि मैं पहेली का यह बहुत महत्वपूर्ण हिस्सा/टुकड़ा करना भूल जाता हूं! इसे पोस्ट करने के लिए धन्यवाद। –

19

मैं जानता हूँ कि यह एक पुरानी पोस्ट है लेकिन ड्रयू मार्श के जवाब देने के लिए और नहीं दिखाई दे रहा स्तंभ शीर्ष लेख के तीर के साथ Danm के मुद्दे के जवाब में इसके अलावा में ... आप SortDirection संपत्ति th को जोड़ने की जरूरत है ई DataGridColumn:

<DataGridTextColumn Header="Name" Binding="{Binding Name}" SortDirection="Ascending" /> 

मैं इस बारे में एक प्रश्न पोस्ट और कुछ दिनों के बाद जवाब मिला:

ColumnHeader arrows not reflected when sorting a DataGrid in XAML

+0

इसका मतलब यह है कि 'SortDirection' प्रॉपर्टी को' सॉर्टडिस्क्रिप्शन 'में कॉलम मैन्युअल रूप से मेल खाना चाहिए - क्या डेटाग्रिड के लिए CollectionViewSource की सॉर्टिंग का पता लगाने और स्वचालित रूप से संकेतक प्रदर्शित करने का कोई तरीका है? – Dai

0

यह मेरे लिए काम करता है।

ListSortDirection sortDirection; 
int selectedColumnIndex; 
private void customerDataGrid_Sorting(object sender, DataGridSortingEventArgs e) 
{ 
    selectedColumnIndex = e.Column.DisplayIndex; 
    sortDirection = (e.Column.SortDirection == ListSortDirection.Ascending ? ListSortDirection.Descending: ListSortDirection.Ascending); 
} 

private void applySortDescriptions(ListSortDirection listSortDirection) 
{ 
    //Clear current sort descriptions 
    customerDataGrid.Items.SortDescriptions.Clear(); 

    //Get property name to apply sort based on desired column 
    string propertyName = customerDataGrid.Columns[selectedColumnIndex].SortMemberPath; 

    //Add the new sort description 
    customerDataGrid.Items.SortDescriptions.Add(new SortDescription(propertyName, listSortDirection)); 

    //apply sort 
    applySortDirection(listSortDirection); 

    //refresh items to display sort 
    customerDataGrid.Items.Refresh(); 
} 

private void applySortDirection(ListSortDirection listSortDirection) 
{ 
    customerDataGrid.Columns[selectedColumnIndex].SortDirection = listSortDirection; 
} 
संबंधित मुद्दे