使用自定义排序顺序

时间:2015-04-24 08:54:42

标签: c# wpf sorting

在WPF中,我有一个ObservableCollection,我需要以任意自定义顺序排序,这意味着它不仅仅是A-Z,项目需要单独移动。

BusinessObject有一个ID字段,它是一个字符串GUID。我可以使用词典,在排序顺序中存储这些GUID及其分配的位置,如果是这样,我如何从单独的词典中应用排序顺序?

简而言之,我希望能够为ObservableCollection提供一个可操作的排序顺序,存储在一个单独的对象中。

2 个答案:

答案 0 :(得分:1)

使用ICollectionView:

var view = CollectionViewSource.GetDefaultView(businessObjects);
view.SortDescriptions.Add( SortDescription("NameOfPropertyToSortBy",ListSortDirection.Ascending ));

然后公开并绑定到视图值。虽然,实际上在封面下有绑定的黑魔法,你甚至不需要改变绑定的集合,但是如果你这样做的话就更容易维护。

答案 1 :(得分:1)

我知道你已经接受了答案,但我遇到了类似的问题,重要的是没有重新创建ObservableCollection<T>,并且使用{{1移动了集合中的对象方法(而不是删除和插入)到他们的新索引。这是为了促进WPF流体移动动画等。

在这种情况下,我创建了一个扩展方法,允许您按首选排序顺序传递ObservableCollection.Move()个对象,并让IEnumerable<T>将所有内容移动到位。

这很简单,所以我在这里发布以防万一对任何人都有用:

ObservableCollection<T>

注意:这远非万无一失,因为它理想地依赖于public static class ObservableCollectionExtensions { public static void MatchSort<T>(this ObservableCollection<T> collection, IEnumerable<T> collectionToMatchSortOrder) { int newIndex = 0; foreach (var item in collectionToMapSortOrder.Where(item => collection.Contains(item))) { collection.Move(collection.IndexOf(item), newIndex); newIndex++; } } } 中可见的集合中存在的所有对象。