【问题标题】:InvalidOperationException while sorting an ObservableCollection对 ObservableCollection 进行排序时出现 InvalidOperationException
【发布时间】:2013-12-23 00:04:41
【问题描述】:

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

这是我正在查看的示例:

List<Person> list = new List<Person>(people);
list.Sort();

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

我的问题:在尝试实施上述解决方案时,我收到了 InvalidOperationException。我觉得我不明白如何告诉List 根据排名进行排序。

我的代码是什么样子的:

List<TreeModel> sortedTree = new List<TreeModel>(TreeCollection);
sortedTree.Sort();

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

谢谢。

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

【问题讨论】:

    标签: c# wpf list sorting observablecollection


    【解决方案1】:

    Sort throws 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);
    

    【讨论】:

    • 好的,这样List 将根据存储在 Rank 中的整数进行排序。这样做之后,我不需要将当前的ObservableCollection 设置为等于新排序的吗?
    • @Ericafterdark 没错,您需要创建一个新的ObservableCollection,或者清除/重新填充现有的@Ericafterdark(前者可能更容易)。
    • 这就是我刚刚所做的:CurrentCollection = new ObservableCollection&lt;TreeModel&gt;(sortedTree);。不过好像不影响视野。也许我忘记了 PropertyChanged?
    • @Ericafterdark 对,如果你更换收藏,你需要提高 PropertyChanged ...
    • 工作就像一个魅力!您可能希望将我在该评论中使用的代码添加到您的答案中。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-08-25
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      相关资源
      最近更新 更多