【WPF】数据视图的排序、过滤、分组功能介绍

WPF中数据视图提供了许多功能,如过滤、排序、分组等,这里简单介绍其使用方法。

  1. 过滤
    在将集合作为数据源时,可使用视图对象的Filter属性设置过滤器,Filter属性接收一个Predicate委托,委托指向自定义的筛选方法:
    过滤器依次检查数据源集合中的第一项,满足过滤条件,则返回true,不满足返回false。
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(this.ProductList);
view.Filter = new Predicate<object>(DoFilter);
  1. 排序
    最简单的方法是根据每个数据项中的一个或多个属性的值进行排序,使用System.ComponentModel.SortDescription对象确定希望使用的字段及排序方向(升序或降序):
ListCollectionView view =  (ListCollectionView)CollectionViewSource.GetDefaultView(this.ProductList);
view.SortDescriptions.Add(new SortDescription("PropertyName", ListSortDirection.Ascending));
view.SortDescriptions.Add(new SortDescription("PropertyName1", ListSortDirection.Ascending));

默认的排序规则是按字母或数字顺序,当然也可执行自定义排序,但只能应用于ListCollectionView视图,不能应用于BindingListCollectionView视图。ListCollectionView类的CustomSort接收一个IComparer对象。下面是一个DataGrid控件列头手动排序的简单示例:

((ListCollectionView)SeriesListView).CustomSort = new ProductComparer(ListSortDirection.Ascending);
public class ProductComparer : IComparer
{
    private readonly ListSortDirection _sortDirection;
    public ProductComparer(ListSortDirection direction)
    {
        this._sortDirection = direction;
    }
    
    public int Compare(object x, object y)
    {
        Product xSeries = x as Product;
        Product ySeries = y as Product;
        int flag = _sortDirection == ListSortDirection.Ascending ? 1 : -1;
        int result;
        //具体的比较规则
        return flag * result;
    }
}
  1. 分组
    以简单的方式进行分组:
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(this.ProductList);
view.SortDescriptions.Add(new SortDescription("PropertyName", ListSortDirection.Ascending));
view.GroupDescriptions.Add(new PropertyGroupDescription("GroupPropertyName"));
  1. 在当前视图的过滤、排序、分组条件条件发生变化时,需要调用ICollectionViewSource.Refresh()方法,重新刷新视图。但在某些场景下,更改捕获困难,如某处程序更改了数据源中某项数据的某个属性值(过滤等条件未变化),导致该项数据不再满足筛选条件,但若未调用Refresh()方法强制执行更新,会导致看不到变化。
    WPF4.5引入了“实时成型”功能,通过监视特定属性的变化,来触发刷新操作,但增加了额外开销。
    对于ObservableCollection类型的数据源,通过IsLiveFiltering属性打开实时成型功能,通过LiveFilteringProperties属性设置需要监视的属性:
ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(this.ProductList);
view.IsLiveFiltering = true;
view.LiveFilteringProperties.Add("PropertyName");
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

woniudaidai

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值