您的位置:首页 > 其它

WPF 通过行为在xaml上控制itemscontrol(listbox,listview等)的排序分组

2017-04-20 15:38 218 查看
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.排序效果(根据年龄进行降序排列)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: