2013-02-20 45 views
13

वर्तमान में, मेरा संग्रहव्यूसोर्स विवरण द्वारा आइटमों का संग्रह टाइप करता है। यदि विवरण वही है, तो मैं आईडी के आधार पर सॉर्ट करना चाहता हूं। मैं पहले विवरण द्वारा क्रमबद्ध करने के लिए कैसे निर्दिष्ट कर सकता हूं, फिर आईडी द्वारा?आप एक प्रॉपर्टीव्यूसोर्स को एक प्रॉपर्टी द्वारा कैसे क्रमबद्ध करते हैं, फिर दूसरे द्वारा एक टाईब्रेक के रूप में?

मैंने PropertyName = "Id" के साथ एक दूसरा सॉर्ट डिस्क्रिप्शन जोड़ने का प्रयास किया है, लेकिन यह काम नहीं किया है।

<CollectionViewSource x:Key="Items" Source="{Binding Items}" > 
<CollectionViewSource.SortDescriptions> 
<scm:SortDescription PropertyName="Description"/> 
</CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

संपादित करें: आईडी संपत्ति viewmodel पर निजी था। कोई त्रुटि फेंक दिया नहीं।

+1

शायद यह मदद मिलेगी? http://stackoverflow.com/q/6469303/56778 –

उत्तर

33

मुझे यकीन नहीं है कि Id के लिए क्यों काम नहीं कर रहा है क्योंकि यह ठीक काम करना चाहिए।

इस तरह:

<CollectionViewSource x:Key="Items" Source="{Binding ElementName=UI, Path=Items}" > 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="Description" /> 
     <scm:SortDescription PropertyName="Id" /> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

मैं एक साथ इस काम कर रहे है इसके पूर्ण उदाहरण डाल के रूप में आप चाहते हैं:

Xaml:

<Window x:Class="WpfApplication7.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" 
    Title="MainWindow" Height="124" Width="464" Name="UI" > 
<Window.Resources> 

    <CollectionViewSource x:Key="Items" Source="{Binding ElementName=UI, Path=Items}" > 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="Description" /> 
     <scm:SortDescription PropertyName="Id" /> 
    </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 
</Window.Resources> 

<Grid> 
    <ListBox ItemsSource="{Binding Source={StaticResource Items}}" /> 
</Grid> 

कोड:

public partial class MainWindow : Window 
{ 
    private ObservableCollection<MyObject> myVar = new ObservableCollection<MyObject>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Items.Add(new MyObject { Description = "Stack", Id = 5 }); 
     Items.Add(new MyObject { Description = "OverFlow", Id = 1 }); 
     Items.Add(new MyObject { Description = "StackOverFlow", Id = 2 }); 
     Items.Add(new MyObject { Description = "Stack", Id = 1 }); 
     Items.Add(new MyObject { Description = "Stack", Id = 0 }); 
     Items.Add(new MyObject { Description = "OverFlow", Id = 7 }); 
    } 

    public ObservableCollection<MyObject> Items 
    { 
     get { return myVar; } 
     set { myVar = value; } 
    } 
} 


public class MyObject 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 

    public override string ToString() 
    { 
     return string.Format("Desc: {0}, Id: {1}", Description, Id); 
    } 
} 

परिणाम:

enter image description here

+0

यहां ध्यान देने योग्य मूल्य है कि प्रारंभिक कॉम्पोनेंट्स कहने से पहले myVar संग्रह को तुरंत चालू करने की आवश्यकता है। – Jono

0

@ sa_ddam213 का जवाब काम करना चाहिए, लेकिन आप अतिरिक्त ToString() विधि जरूरत नहीं है, आपको अपने एक्सएएमएल में जोड़ने की ज़रूरत है IsLiveFilteringRequested, कम से कम .NET Framework 4.5.1 में चालू करना है।

<CollectionViewSource IsLiveFilteringRequested="True" x:Key="Items" Source="{Binding ElementName=UI, Path=Items}"> 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="Description" /> 
     <scm:SortDescription PropertyName="Id" /> 
    </CollectionViewSource.SortDescriptions>