2011-04-07 76 views
5

我有一个ListView(GridView),我想按2列进行排序,因此如果2+项在列1中具有相同的值,则按列2排序。简单。但排序A-Z时,空字符串显示在顶部。我想将它们移到底部。我做了一个比较器(IComparer)来处理这个问题,但我不确定如何使用它。WPF - 在按多列进行排序时使用自定义比较器

这是我试过的代码:

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 ...

有谁知道如何做到这一点?

回答

6

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支持多列排序,我用Google搜索,发现this comparer implementation,你可以给它Severa的用逗号隔开,并与ASC/DESC后缀像该L属性路径:

User.LastName DESC, User.FirstName DESC 

我觉得对于多列至于UI而言排序的惯例是,你需要有Ctrl按钮举行。因此,继承ListView类的子类并绑定到GridViewColumnHeader单击的事件和KeyDown事件中,以了解连续单击了哪些列,然后使用实现将其馈入。

+0

这对一列进行排序时有效,但由于PropertyPath引用了被单击的列(也是我的代码中的sortHeader),因此即使它应该比较第二列(第二个SortDescription )。比较器如何知道它应该看第一列(点击的那一列)还是第二列(当列2中有2+的值相同时)? – grant 2011-04-07 23:28:10

+0

上面做了一些更改,尝试回答你确切的问题:) – Jose 2011-04-08 13:17:16

相关问题