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
节点,我需要能够上下移动,基本上改变顺序。MyTreeView
是特定数据模型的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();