C# 对ObservableCollection排序时出现InvalidOperationException

C# 对ObservableCollection排序时出现InvalidOperationException,c#,wpf,list,sorting,observablecollection,C#,Wpf,List,Sorting,Observablecollection,在我的程序中,我有TreeView节点,我需要能够上下移动,基本上改变顺序。MyTreeView是特定数据模型的ObservableCollection。每个节点都有一个名为“Rank”的属性,这是我希望按其对集合进行排序的值。说到这里,我指的是。从这个问题我发现了这个。我正在尝试第二种方法,该方法涉及列表的排序功能 这就是我所看到的例子: List<Person> list = new List<Person>(people); list.Sort(); 我错过了什么

在我的程序中,我有
TreeView
节点,我需要能够上下移动,基本上改变顺序。My
TreeView
是特定数据模型的
ObservableCollection
。每个节点都有一个名为“Rank”的属性,这是我希望按其对集合进行排序的值。说到这里,我指的是。从这个问题我发现了这个。我正在尝试第二种方法,该方法涉及
列表的
排序
功能

这就是我所看到的例子:

List<Person> list = new List<Person>(people);
list.Sort();
我错过了什么?如何根据rank属性对集合进行排序,并在视图中反映这些更改

多谢各位

*我相信我以前可能已经发布过这个问题,因此如果出于某种原因,这个问题与我的旧问题太相似,我将删除旧问题。

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

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

但是,您可以通过以下方式提供比较:

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

CurrentCollection=新的ObservableCollection(sortedTree);

您需要传递
属性名
,您希望在该属性名上对列表进行如下排序-

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

好的,这使得
列表将根据存储在Rank中的整数进行排序。这样做之后,我就不需要将当前的
ObservableCollection
设置为新的排序集合了吗?@eric完全正确,您需要创建一个新的
ObservableCollection
,或者清除/重新填充现有集合(前者可能更容易)这就是我刚才做的:
CurrentCollection=newobserveCollection(sortedTree)。不过,这似乎并不影响视图。也许我忘了财产改变了?@Eric是的,如果你更换了收藏品,你就需要筹集财产改变了…工作起来很有魅力!您可能希望将我在该注释中使用的代码添加到您的答案中。非常感谢。
sortedTree.Sort((x, y) => x.Rank.CompareTo(y.Rank));
CurrentCollection = new ObservableCollection<TreeModel>(sortedTree);
sortedTree = sortedTree.OrderBy(m => m.Rank).ToList();