【问题标题】:Keep order of items in ICollectionView if they are considered equal如果它们被认为是相等的,则保持 ICollectionView 中的项目顺序
【发布时间】:2014-06-23 14:54:52
【问题描述】:

我有以下情况:我得到一个应该按SortId 属性排序的项目列表。

我已经在我的 ItemViewModels 中实现了IComparable<T> 接口,这样我就可以在我的ICollectionView.CustomSort 属性中使用Comparer.Default 来应用排序而不使用反射(PropertySortDescription 会这样做)。

现在,我的问题是项目有时没有设置SortId 属性,因为它们应该按照它们在集合中出现的顺序简单地排序。但是,项目并没有保持顺序,而是以相反的顺序显示,有时甚至完全混合 - 这似乎取决于项目的数量。

有没有办法避免这种行为?如果我不应用任何排序,则项目以正确的顺序出现。但是,我必须根据项目的 SortId 属性动态打开或关闭排序 - 我根本不喜欢......还有其他想法吗?

【问题讨论】:

  • 在我看来,thisstable sorting algorithm 的组合可以解决问题。 Linq2Objects .OrderBy 稳定。
  • 感谢您的建议!到目前为止我还不知道稳定的排序算法——所以至少我学到了一些新东西,尽管我没有尝试这个,因为它会改变我的整个排序策略。

标签: c# wpf sorting mvvm icollectionview


【解决方案1】:

通过更新CompareTo方法的实现,你可以保证那些没有定义SortId的对象的排序顺序

例如

    public class MyItem : IComparable
    {
        public int? SortId { get; set; }

        public int CompareTo(object other)
        {
            if (SortId == null)
                return -1;

            MyItem otherItem = other as MyItem;
            if (otherItem == null || otherItem.SortId == null)
                return 1;

            return SortId.Value.CompareTo(otherItem.SortId.Value);
        }
    }

上面将保证没有排序ID的对象会比其他对象小

【讨论】:

  • 感谢您的建议,但这并不是我想要的。有时我得到only 项没有SortId。在这种情况下,我不想对它们进行排序,但我想保持它们在集合中的顺序。但是,在这种情况下,调整 CompareTo(...) 方法也可能有效。我会试一试...
  • SortId 不可用时可以返回 0 以保持订单不变。
  • 这就是我所做的(返回 0),但这改变了我的项目的顺序。由于 WPF 认为它们相等,因此顺序无关紧要,因此 WPF 将它们混合在一起。假设我的 source list 中的项目的顺序为 1、2、3、4...9,但是当在CompareTo 中为所有这些项目返回 0 时,它们会显示 1、3、5、7、8、9、2、4、6!似乎有一种模式很可能来自排序算法。
  • 如果您可以确定没有 SortId,也许您应该完全避免排序。如果列表中没有 then 的元素很少,也许我们可以编写一个算法来确定它们的 id。
  • 如果两个项目都没有设置SortId 属性,我终于通过始终返回1 来实现所需的行为。我不完全理解为什么会这样。原因可能是项目一个接一个地添加,并且在每个项目之后都应用了排序......我不知道,但我很高兴它可以工作! :) 感谢您修改CompareTo(...) 方法的想法!我以前没有考虑过。
猜你喜欢
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 2013-10-25
  • 1970-01-01
相关资源
最近更新 更多