C# 按组排序CollectionView,其中组是使用ValueConverter创建的
我有一个CollectionView,cv,who的项目分为两组,如下所示: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
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?解决了这个问题。我还在同一个集合中使用了一些分类描述。你知道有没有办法将上面讨论的分组排序优先于我正在处理的所有排序描述?