gpt4 book ai didi

c# - WPF - 按多列排序时使用自定义比较器

转载 作者:太空狗 更新时间:2023-10-29 21:30:21 25 4
gpt4 key购买 nike

我有一个 ListView (GridView),我想按 2 列排序,所以如果 2+ 个项目在第 1 列中具有相同的值,它会按第 2 列排序。非常简单。但是在对 A-Z 进行排序时,空字符串会出现在顶部。我想将它们移到底部。我制作了一个比较器 (IComparer) 来处理这个问题,但我不确定如何使用它。

这是我试过的代码:

 Dim view As ListCollectionView = CollectionViewSource.GetDefaultView(myCollection)
Using view.DeferRefresh
view.SortDescriptions.Clear()
view.SortDescriptions.Add(New SortDescription(sortHeader.Header, direction))
view.SortDescriptions.Add(New SortDescription(otherColumn, direction))
view.CustomSort = New MyComparer()
End Using

问题是我的比较器得到了我的类的类型,而不是排序所依据的属性/列的值。因此,如果类是 Foo 并且我按 Foo.Bar 排序,我会得到整个 Foo 类,而不仅仅是 Bar 的值(这实际上是它应该关心的全部,因为这是它排序的依据)。

我的比较器如何知道比较哪个属性?也许我在这里做错了什么,因为这没有任何意义。我希望得到 x 和 y 的字符串(属性类型)...

有人知道怎么做吗?

最佳答案

您的 IComparer 实现将获得整个对象,您需要确定点击了哪一列,可能是通过执行如下操作:

this.AddHandler(GridViewColumnHeader.ClickEvent, 
new RoutedEventHandler(Column_Sort));

然后可能通过修改您的构造函数以接受属性路径,将其提供给您的 MyComparer

Column_Sort 中,您可以获得类似这样的属性路径(我对 vb 有点生疏,但 c# 会这样做:

void Column_Sort(object sender, RoutedEventArgs e)
{
var memberBinding= ((GridViewColumnHeader)e.OriginalSource).Column.DisplayMemberBinding;
var path = ((Binding)memberBinding).Path.Path;
}

然后将其输入到您的排序逻辑中。

Dim view As ListCollectionView = CollectionViewSource.GetDefaultView(myCollection)
Using view.DeferRefresh
view.SortDescriptions.Clear()
view.SortDescriptions.Add(New SortDescription(sortHeader.Header, direction))
view.SortDescriptions.Add(New SortDescription(otherColumn, direction))
view.CustomSort = New MyComparer(PropertyPath)
End Using

编辑:你只需要定制你的 IComparer 来支持多列排序,我用谷歌搜索并找到了 this comparer implementation您可以为它提供多个属性路径,这些路径以逗号分隔并以 ASC/DESC 为后缀,如下所示:

User.LastName DESC, User.FirstName DESC

我认为就 UI 而言,多列排序的惯例是您需要按住 Ctrl 按钮。因此,继承 ListView 类并绑定(bind)到 GridViewColumnHeader clicked 事件和 KeyDown 事件以了解连续单击了哪些列,然后使用 IComparer 实现将其馈入。

关于c# - WPF - 按多列排序时使用自定义比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5588353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com