排序ObservableCollection时出现InvalidOperationException

时间:2013-12-05 20:45:56

标签: c# wpf list sorting observablecollection

在我的程序中,我有TreeView个节点,我需要能够上下移动,基本上改变顺序。我的TreeView是特定数据模型的ObservableCollection。每个节点都有一个名为“Rank”的属性,这是我想要对其进行排序的值。话虽如此,我提到this question。从那个问题我发现了blog page。我正在尝试涉及sort的{​​{1}}函数的第二种方法。

这是我正在看的例子:

List

请注意,每个节点的“Rank”值处于正常工作状态并正确更改。我只需要找到一种基于该属性重新排序集合的方法,并将其反映在View中。

我的问题:在尝试实施上述解决方案时,我得到List<Person> list = new List<Person>(people); list.Sort(); 。我觉得我不明白如何告诉InvalidOperationException根据排名进行排序。

我的代码是什么样的:

List

我在这里缺少什么?如何根据rank属性对集合进行排序并在视图中反映这些更改?

谢谢。

*我相信我之前可能已经发布了这个,所以如果由于某种原因这个问题与我的旧问题太相似,我只会删除旧问题。

2 个答案:

答案 0 :(得分:2)

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

  

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

但您可以将比较作为first parameter to Sort

提供
sortedTree.Sort((x, y) => x.Rank.CompareTo(y.Rank));

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

CurrentCollection = new ObservableCollection<TreeModel>(sortedTree);

答案 1 :(得分:1)

您需要通过property name对列表进行排序,如下所示 -

sortedTree = sortedTree.OrderBy(m => m.Rank).ToList();