【问题标题】:Sort CollectionView by group, where the group was created with a ValueConverter按组对 CollectionView 进行排序,其中组是使用 ValueConverter 创建的
【发布时间】:2018-01-17 20:08:43
【问题描述】:

我有一个CollectionView,cv,谁的项目被分成两组,如下所示:

cv.GroupDescriptions.Add(new PropertyGroupDescription(null, new ItemGroupConverter()));

如果没有常规属性可放入 SortDescription 中,如何按照我的转换器的指示按组从属关系对 CollectionView 进行排序?我想在不为我的 CollectionView 中的项目创建新属性的情况下执行此操作。

另外值得一提的是,我更喜欢将当前的 CollectionViewSource 绑定到 ObservableCollection 而不是 ListCollectionView,因为我的 UI 依赖于一些通知处理程序。

【问题讨论】:

    标签: c# wpf xaml collectionview


    【解决方案1】:

    如果您的CollectionViewListCollectionView,您可以使用ListCollectionView.CustomSort 属性设置IComparer 进行自定义排序。您可以扩展您当前的ItemGroupConverter 类以实现IComparer 接口,或者创建一个实现IComparer 的新类,该类使用IValueConverter 来比较值。假设您的 Convert 返回一个字符串或其他一些 IComparable:

    public class ItemGroupConverter : IValueConverter, IComparer
    {
        //... your existing implementation of Convert and ConvertBack
    
        public int Compare(object x, object y)
        {
            return ((IComparable)Convert(x, null, null, null)).CompareTo(((IComparable)Convert(y, null, null, null)));
        }
    }
    

    并像这样使用它:

    ((ListCollectionView)cv).CustomSort = new ItemGroupConverter();
    

    另一个选项是您传递IValueConverter 实例以使用的比较器:

    public class ConverterComparer : IComparer
    {
        private readonly IValueConverter converter;
    
        public ConverterComparer(IValueConverter converter)
        {
            this.converter = converter;
        }
    
        public int Compare(object x, object y)
        {
            return ((IComparable)converter.Convert(x, null, null, null)).CompareTo(((IComparable)converter.Convert(y, null, null, null)));
        }
    }
    

    并像这样使用它:

    ((ListCollectionView)cv).CustomSort = new ConverterComparer(new ItemGroupConverter());
    

    【讨论】:

    • 很遗憾我的CollectionView 不是ListCollectionView。我将ObservableCollection 用于我的CollectionViewSource,因为我需要将我的CollectionView 的项目挂钩到我的底层ListBox 的ItemSource 中,以便可以在我的UI 中查看它们。在这种情况下有什么解决方法吗?
    • 你确定吗?如果您使用ObservableCollection 作为Source,那么我相信CollectionViewSource 应该使用ListCollectionView 作为CollectionView 类型。在调试器中查看CollectionView 的实际类型。
    • 我的错,你是对的。然而,使用这种方法,我的 Compare 方法似乎永远不会被调用,即使在我的 CollectionView 上调用了 Refresh() 之后也是如此。
    • 也许尝试将IsLiveSorting 设置为true?
    • 解决了这个问题。我还在同一个集合上使用了一些 SortDescriptions。您知道是否有办法将上面讨论的组排序优先于我正在使用的所有 SortDescriptions?
    【解决方案2】:

    我想我明白了:

    戴夫的回答确实有效。虽然,我不得不将我的 ConverterComparer 分成不同的类,因为我需要在如何区分组和如何对整个集合进行排序之间略有不同的逻辑。

    我不知道如何使我们在我的Converter 中制定的组排序优先于我的SortDescription,所以我最终摆脱了SortDescription 并将该逻辑添加到我的Comparer 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 2016-10-06
      • 2015-05-13
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多