17

現在、私のCollectionViewSourceは、アイテムのコレクションを説明で並べ替えています。説明が同じ場合は、IDで並べ替えたいと思います。最初に説明でソートし、次にIDでソートするように指定するにはどうすればよいですか?

PropertyName = "Id"を使用して2番目のSortDescriptionを追加しようとしましたが、機能しませんでした。

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

編集: IDプロパティはビューモデルでプライベートでした。エラーはスローされません。

4

3 に答える 3

42

SortDescriptionforを追加してもうまくいくはずなので、なぜうまくいかないのかわかり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);
    }
}

結果:

ここに画像の説明を入力してください

于 2013-02-21T00:08:30.260 に答える
2

@ sa_ddam213の答えは機能するはずですが、余分なToString()メソッドは必要ありません。XAMLに追加する必要があるのは、少なくとも.Net Framework 4.5.1の場合と同様に、IsLiveFilteringRequestedをオンにすることだけです。

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

于 2016-02-04T00:04:03.620 に答える
1

私の場合、変換してから注文する必要のある列挙型のリストがありました。私のコードは、他の答えの助けを借りて、このようになってしまいました。

<CollectionViewSource x:Key="MyEnumList" Source="{Binding ListFromViewModel, Converter={StaticResource MyEnumConverter}}">
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="."/>
    </CollectionViewSource.SortDescriptions>                
</CollectionViewSource>
于 2019-07-29T08:05:44.830 に答える