解决 ListView PropertyGroupDescription自定义排序

456

成员
已加入
2020年4月19日
留言内容
9
编程经验
1-3
你好,

我有一个绑定到视图模型的ListView,我使用PropertyGroupDescriptions在列表视图中设置分组:

C#:
            BrowserItemCollectionView = CollectionViewSource.GetDefaultView(myCollection);

            //Set up filter
            BrowserItemCollectionView.Filter = FilterBrowserItems;

            //Set up grouping
            PropertyGroupDescription L1PGD = new PropertyGroupDescription(nameof(BrowserItem.L1group));
            PropertyGroupDescription L2PGD = new PropertyGroupDescription(nameof(BrowserItem.L2group));
            PropertyGroupDescription L3PGD = new PropertyGroupDescription(nameof(BrowserItem.L3group));
            BrowserItemCollectionView.GroupDescriptions.Add(L1PGD);
            BrowserItemCollectionView.GroupDescriptions.Add(L2PGD);
            BrowserItemCollectionView.GroupDescriptions.Add(L3PGD);

然后使用以下方法对组进行排序:

C#:
            //Setup Sorting
            BrowserItemCollectionView.SortDescriptions.Add(new SortDescription(nameof(BrowserItem.L1group), ListSortDirection.Ascending));
            BrowserItemCollectionView.SortDescriptions.Add(new SortDescription(nameof(BrowserItem.L2group), ListSortDirection.Ascending));
            BrowserItemCollectionView.SortDescriptions.Add(new SortDescription(nameof(BrowserItem.L3group), ListSortDirection.Ascending));
C#:

这一切都很好,但是我想通过自己的自定义方法对组之一进行排序,但是我看不到如何指定它:

C#:
            BrowserItemCollectionView.SortDescriptions.Add(new SortDescription(nameof(BrowserItem.L1group), MYSORTING));

但是我看不到使用自定义排序对SortDesciption进行排序的任何方法。

我希望能找到一些关于最佳方法的建议。
谢谢。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
将视图强制转换为ListCollectionView并将CustomSort设置为实现IComparer的类实例。
 

456

成员
已加入
2020年4月19日
留言内容
9
编程经验
1-3
好的,但是我如何将排序应用于特定的SortDescription-即

BrowserItemCollectionView.SortDescriptions.Add(new SortDescription(nameof(BrowserItem.L2group),MYSORTING));

谢谢。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
SortDescription用于使用默认比较对特定属性asc / desc进行排序。使用CustomSort,您可以完全控制自己的排序。
设置此属性将清除先前设置的 排序说明 value.
 

456

成员
已加入
2020年4月19日
留言内容
9
编程经验
1-3
@约翰·H -它是对我需要实现的特定属性的自定义排序,因为我正在向某些软件编写插件,并试图匹配它们的排序,所以这只会在树的特定级别上发生...其余控件字母排序很好。使用CustomSort可以将其仅应用于一个属性吗? (我不知道如何...)

@jmcilhinney - 感谢那。我已经按照您的示例设置了一个字符串长度比较器作为测试。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
这仅在树的特定级别上发生
事实并非如此,所有项目均根据SortDescriptions或CustomSort进行排序。您可以根据需要添加任意多个排序级别,并且可以在对象之间执行任何类型的比较。

在第1部分中,有一个示例,这是另一个示例,类型User是按Age / LastName / FirstName属性排序的:
C#:
class UserSort : IComparer<User>, IComparer
{
    public int Compare(User x, User y)
    {
        var result = x.Age.CompareTo(y.Age);
        if (result == 0)
            result = x.LastName.CompareTo(y.LastName);
        if (result == 0)
            result = x.FirstName.CompareTo(y.FirstName);
        return result;
    }

    int IComparer.Compare(object x, object y)
    {
        return Compare((User)x, (User)y);
    }
}
虽然仅使用IComparer,但我希望通过IComparer设置排序<T>然后将非泛型路由到该地址。
此示例与为这三个属性中的每个属性添加一个SortDescription相同,但是Compare方法在比较方式上更加灵活。
 

456

成员
已加入
2020年4月19日
留言内容
9
编程经验
1-3
你好,

感谢您的回复,我实际上正在使用该博客中的IComparer例程,该例程比较了字符串长度(作为测试例程)

我正在努力解决的问题是如何将自定义排序应用于特定的PropertyGroupDescrption。

我正在使用的ListView具有6个PropertyGroupDescriptions,我通过以下方式设置了PropertyGroupDescriptions:

C#:
PropertyGroupDescription L1PGD = new PropertyGroupDescription(nameof(BrowserItem.L1group));

我需要升序排列的6个组中的5个,我将其设置为:

C#:
BrowserItemCollectionView.SortDescriptions.Add(new SortDescription(nameof(BrowserItem.L1group), ListSortDirection.Ascending));

但是,我需要对创建的IComparer类进行特殊排序-我该如何对此类设置排序,因为这不起作用:

C#:
BrowserItemCollectionView.SortDescriptions.Add(new SortDescription(nameof(BrowserItem.L1group), MySpecialSorting));

我想念什么吗?
干杯。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
您不能混合使用SortDescriptions和CustomSort。您可以在Compare方法中设置所有级别的排序。
在我发布的示例中,应用了3个排序级别。比较3个属性,首先按年龄,然后按姓氏,然后按名字进行比较。就像您为这3个属性添加了3个SortDescriptions一样。
 
最佳 底部