如何对一个属性对CollectionViewSource进行排序,然后将另一个属性作为tiebreak进行排序?
问题描述:
目前,我的CollectionViewSource按描述对项目集合进行排序。如果描述相同,我想根据ID进行排序。我如何指定先按描述进行排序,然后按ID排序?如何对一个属性对CollectionViewSource进行排序,然后将另一个属性作为tiebreak进行排序?
我试着用PropertyName =“Id”添加第二个SortDescription,但那没有奏效。
<CollectionViewSource x:Key="Items" Source="{Binding Items}" >
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Description"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
编辑: ID属性是在视图模型私人。没有错误抛出。
答
我不确定为什么要为Id
添加SortDescription
不起作用,因为它应该可以正常工作。
像这样:
<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);
}
}
结果:
+0
值得注意的是,在调用InitializeComponents之前,需要实例化myVar集合。 – Jono 2017-02-26 18:17:02
答
@ 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>
或许这将帮助? http://stackoverflow.com/q/6469303/56778 – 2013-02-21 00:08:30