Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按组排序CollectionView,其中组是使用ValueConverter创建的_C#_Wpf_Xaml_Collectionview - Fatal编程技术网

C# 按组排序CollectionView,其中组是使用ValueConverter创建的

C# 按组排序CollectionView,其中组是使用ValueConverter创建的,c#,wpf,xaml,collectionview,C#,Wpf,Xaml,Collectionview,我有一个CollectionView,cv,who的项目分为两组,如下所示: cv.GroupDescriptions.Add(new PropertyGroupDescription(null, new ItemGroupConverter())); 如果没有常规属性来进行排序描述,我如何按照我的转换器所指示的组从属关系对CollectionView进行排序?我希望在不为CollectionView中的项目创建新属性的情况下执行此操作 另外值得一提的是,我更喜欢将我当前的Collection

我有一个CollectionView,cv,who的项目分为两组,如下所示:

cv.GroupDescriptions.Add(new PropertyGroupDescription(null, new ItemGroupConverter()));
如果没有常规属性来进行排序描述,我如何按照我的转换器所指示的组从属关系对CollectionView进行排序?我希望在不为CollectionView中的项目创建新属性的情况下执行此操作


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

如果你的
CollectionView
ListCollectionView
,你可以使用属性设置一个
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
。我正在为我的
CollectionViewSource
使用一个
ObservableCollection
,因为我需要将我的CollectionView的项目挂钩到我的基础列表框的ItemSource中,以便可以在我的UI中查看它们。在这种情况下有什么解决办法吗?你确定吗?如果使用
observateCollection
作为源代码,那么我认为CollectionViewSource应该使用
ListCollectionView
作为
CollectionView
类型。在调试器中查看您的
CollectionView
的实际类型。我错了,您是对的。但是,使用这种方法,似乎永远不会调用我的Compare方法,即使在我的CollectionView上调用了Refresh()之后也是如此。也许可以尝试将
IsLiveSorting
设置为true?解决了这个问题。我还在同一个集合中使用了一些分类描述。你知道有没有办法将上面讨论的分组排序优先于我正在处理的所有排序描述?