解决 ListView PropertyGroupDescription自定义排序

Archie456.

成员
加入
4月19日,2020年4月
消息
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进行排序。

我会很欣赏一些指示最好的方法。
谢谢。
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,160
地点
挪威
编程经验
10+
将视图绘制到listCollectionView并将CustomSort设置为实现IComparer的类实例。
 

Archie456.

成员
加入
4月19日,2020年4月
消息
9
编程经验
1-3
好的,但如何将排序应用于特定的SortDescription - 即

browseritemcollectionview.sortdescriptions.add(新的排序文件(nameof(browseritem.l2group),mysorting));

谢谢。
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,160
地点
挪威
编程经验
10+
SortDescription用于使用默认比较对特定的属性ASC / DESC进行排序。使用customsort,您可以完全控制自己的排序。
设置此属性清除先前设置的 sortdescriptions. value.
 

Archie456.

成员
加入
4月19日,2020年4月
消息
9
编程经验
1-3
@Johnh. - 它是一个自定义对我需要实现的特定属性的自定义排序,就像我向某些软件编写addon并尝试匹配他们的排序时,这只发生在树的特定级别......控制的其余部分字母排序很好。使用customsort,我可以将此应用于一个属性吗? (我看不到......)

@jmcilkinney. - 感谢那。根据您的示例,我已设置一个字符串长度比较器作为测试。
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,160
地点
挪威
编程经验
10+
这只发生在树的特定级别
这不是真的,所有项目都根据SortDescrips或CustomSort进行排序。您可以根据需要添加尽可能多的排序级别,并且可以在对象之间执行任何类型的比较。

在第1部分中有一个例子,这里是另一个,yey 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>并只是将非通用路由到那样。
此示例与为每个三个属性中的每个属性添加排序识别的例子相同,但比较方法在您可以比较的情况下更灵活。
 

Archie456.

成员
加入
4月19日,2020年4月
消息
9
编程经验
1-3
你好,

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

我正在努力的点是如何将自定义排序应用于特定的propertygroupdescrattion。

我使用的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));

我错过了什么?
干杯。
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,160
地点
挪威
编程经验
10+
您无法混合SortDescriptions和CustomSort。您可以在比较方法中设置所有级别的排序。
在我发布的例子中,应用了3个排序级别。比较了3个属性,首先按年龄,然后通过姓氏,然后通过名字。就像您已添加3个属性的3个SortDescriptions。
 
最佳 底部