Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用自定义逻辑对ObservableCollection进行排序_C#_Wpf_Sorting_Observablecollection - Fatal编程技术网

C# 使用自定义逻辑对ObservableCollection进行排序

C# 使用自定义逻辑对ObservableCollection进行排序,c#,wpf,sorting,observablecollection,C#,Wpf,Sorting,Observablecollection,对于WPF和observeablecollection来说,我是新手,我需要以自己的方式对其进行排序,并在每次添加或删除内容时对其进行排序 ObservableCollection<User> users = new ObservableCollection<User>(); 我希望所有的IsOp的都按字母顺序排在列表的顶部。然后按字母顺序将所有非ops列在后面 实现这一目标的正确方法是什么 非常感谢。最简单的方法是使用收藏视图: ICollectionView vie

对于
WPF
observeablecollection
来说,我是新手,我需要以自己的方式对其进行排序,并在每次添加或删除内容时对其进行排序

ObservableCollection<User> users = new ObservableCollection<User>();
我希望所有的
IsOp的
都按字母顺序排在列表的顶部。然后按字母顺序将所有非ops列在后面

实现这一目标的正确方法是什么


非常感谢。

最简单的方法是使用
收藏视图

ICollectionView view = CollectionViewSource.GetDefaultView(users);
view.SortDescriptions.Add(new SortDescription("IsOp", ListSortDirection.Descending));
view.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
将视图绑定到该列表时,项目将按指定顺序显示

使用显示的技巧,您甚至可以使用Linq:

var query =
    from u in users.ShapeView()
    orderby u.IsOp descending, u.Name ascending
    select u;

query.Apply();

看看连续LINQ。但是现在WPF中我的列表框不会自动更新,因为它不是observablecollection?是的,如果您将列表框的ItemsSource绑定到observablecollection(您不必绑定到
query
;这只是使用LINQ指定排序顺序的一个技巧)Thomas,因此,如果我理解你的说法是对的,我只做了一次上面的事情,它将永久性地改变我的可观察集合的内部工作,因此不需要改变任何绑定,只要它改变,一切都会被排序?@Muhammad,是的,一旦你设置了collectionviewsource的排序描述,对基础集合的所有进一步更改将自动反映到view@MuhammadA,实际上它不会更改“可观察集合的内部工作”,但会更改集合的默认视图(用于绑定)的属性
var query =
    from u in users.ShapeView()
    orderby u.IsOp descending, u.Name ascending
    select u;

query.Apply();