1.在项目中新增itemscontrol排序的类(可同时对多个条件进行分组排序)
备注:类引用的命名空间
using System.Windows.Controls;
using System.Windows.Interactivity;
using System.ComponentModel;
using System.Windows.Data;
/// <summary> /// 实现ItemsControl(如ListBox)的排序与分组 /// </summary> public class SortAndGroupBehavior : Behavior<ItemsControl> { /// <summary> /// 排序的属性 /// </summary> public string SortProperty { get; set; } /// <summary> /// 分组的属性 /// </summary> public string GroupProperty { get; set; } protected override void OnAttached() { base.OnAttached(); if (!string.IsNullOrEmpty(this.SortProperty)) { var list = this.SortProperty.Split(','); for (int ii = 0; ii < list.Length; ii++) { var str = list[ii]; if (string.IsNullOrEmpty(str)) { continue; } bool asc = true; if (str.EndsWith(" asc", StringComparison.OrdinalIgnoreCase)) { str = str.Substring(0, str.Length - 4); } else if (str.EndsWith(" desc", StringComparison.OrdinalIgnoreCase)) { str = str.Substring(0, str.Length - 5); asc = false; } this.AssociatedObject.Items.SortDescriptions.Add(new SortDescription(str, (asc ? ListSortDirection.Ascending : ListSortDirection.Descending))); } } if (!string.IsNullOrEmpty(this.GroupProperty)) { var list = this.GroupProperty.Split(','); for (int ii = 0; ii < list.Length; ii++) { var str = list[ii]; if (string.IsNullOrEmpty(str)) { continue; } this.AssociatedObject.Items.GroupDescriptions.Add(new PropertyGroupDescription(str)); } } } protected override void OnDetaching() { base.OnDetaching(); this.AssociatedObject.Items.SortDescriptions.Clear(); this.AssociatedObject.Items.GroupDescriptions.Clear(); } }
2.在xaml进行调用,使用listview作为例子
<ListView Margin="5" ItemsSource="{Binding PeopleList}"> <i:Interaction.Behaviors> <local:SortAndGroupBehavior SortProperty="Age desc"/> </i:Interaction.Behaviors> <ListView.View> <GridView> <GridViewColumn Header="国籍" Width="150" DisplayMemberBinding="{Binding Nation}" /> <GridViewColumn Header="城市" Width="150" DisplayMemberBinding="{Binding City}" /> <GridViewColumn Header="姓名" Width="150" DisplayMemberBinding="{Binding Name}" /> <GridViewColumn Header="年龄" Width="150" DisplayMemberBinding="{Binding Age}" /> </GridView> </ListView.View> </ListView>
3.排序效果(根据年龄进行降序排列)