首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InvalidOperationException同时对ObservableCollection进行排序

InvalidOperationException同时对ObservableCollection进行排序
EN

Stack Overflow用户
提问于 2013-12-05 20:45:56
回答 2查看 1.4K关注 0票数 2

在我的程序中,我有TreeView节点,我需要能够上下移动,基本上改变顺序。我的TreeView是特定数据模型的ObservableCollection。每个节点都有一个名为"Rank“的属性,这是我想要对集合进行排序的值。话虽如此,我还是提到了这个问题。从这个问题上我发现了这个博客页。我正在尝试涉及sort函数的List的第二种方法。

这就是我要看的例子:

代码语言:javascript
复制
List<Person> list = new List<Person>(people);
list.Sort();

请注意,每个节点的“等级”值都处于正常工作状态,并且正在正确变化。我只需要找到一种方法来重新排序基于该属性的集合,并在视图中反映它。

我的问题:在尝试实现上面的解决方案时,我得到了一个InvalidOperationException。我觉得我不知道如何告诉List根据等级进行排序。

我的代码是什么样子的:

代码语言:javascript
复制
List<TreeModel> sortedTree = new List<TreeModel>(TreeCollection);
sortedTree.Sort();

我在这里错过了什么?如何根据秩属性对集合进行排序,并在视图中反映这些更改?

谢谢。

*我相信我以前可能曾就此事发表过意见,因此,如果由于某些原因,这个问题与我以前的问题太相似,我只会删除旧问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-05 20:51:53

Sort抛出InvalidOperationException,其组件类型没有默认比较:

默认比较器Comparer.Default找不到IComparable泛型接口或类型T的IComparable接口的实现。

但是,您可以将比较作为Sort提供

代码语言:javascript
复制
sortedTree.Sort((x, y) => x.Rank.CompareTo(y.Rank));

要将排序的项传递回原始集合,可以清除/重新填充CurrentCollection,或者简单地为其分配一个新实例(如果执行后一个实例,请不要忘记给RaisePropertyChanged ):

代码语言:javascript
复制
CurrentCollection = new ObservableCollection<TreeModel>(sortedTree);
票数 1
EN

Stack Overflow用户

发布于 2013-12-05 20:52:32

你需要传递你想要对你的列表进行排序的property name -

代码语言:javascript
复制
sortedTree = sortedTree.OrderBy(m => m.Rank).ToList();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20410328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档