在WPF中,我有一个ObservableCollection,我需要以任意自定义顺序排序,这意味着它不仅仅是A-Z,项目需要单独移动。
BusinessObject有一个ID字段,它是一个字符串GUID。我可以使用词典,在排序顺序中存储这些GUID及其分配的位置,如果是这样,我如何从单独的词典中应用排序顺序?
简而言之,我希望能够为ObservableCollection提供一个可操作的排序顺序,存储在一个单独的对象中。
答案 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++;
}
}
}
中可见的集合中存在的所有对象。