WPF DataGrid 数据过滤

WPF DataGrid 数据过滤

ICollectionView

使集合具有当前记录管理、自定义排序、筛选和分组功能。

  1. 它的 SortDescriptions、GroupDescription 等属性会影响视图的结构,一般情况下会自动刷新。
  2. 也可以直接使用 Refresh 方法来命令视图的刷新(内部实现一般为重建内部视图模型集合)。
  3. 如果是批量操作,也可以使用 RefreshDefer 方法来抑制多次刷新,待多个更新操作后再统一刷新。

属性

CanFilter 获取一个值,该值指示此视图是否支持通过 Filter 属性进行筛选。
CanGroup 获取一个值,该值指示此视图是否支持通过 GroupDescriptions 属性进行分组。
CanSort 获取一个值,该值指示此视图是否支持通过 SortDescriptions 属性进行排序。
Culture 获取或设置根据区域性而可能不同的视图的任何操作(如排序)的区域性信息。
CurrentItem 获取视图中的当前项。
CurrentPosition 获取视图中 CurrentItem 的序号位置。
Filter 获取或设置用于确定某个项是否适合包含在视图中的回调。
GroupDescriptions 获取 GroupDescription 对象的集合,这些对象描述集合中的项在视图中的分组方式。
Groups 获取顶级组。
IsCurrentAfterLast 获取一个值,该值指示视图的 CurrentItem 是否超出集合的末尾。
IsCurrentBeforeFirst 获取一个值,该值指示视图的 CurrentItem 是否超出集合的开头。
IsEmpty 返回一个值,该值指示获得的视图是否为空。
SortDescriptions 获取 SortDescription 对象的集合,这些对象描述集合中的项在视图中的排序方式。
SourceCollection 返回基础集合。

方法

Contains(Object) 返回一个值,该值指示给定项是否属于此集合视图。
DeferRefresh() 进入延迟循环,该循环可用于将更改合并到视图并延迟自动刷新。
MoveCurrentTo(Object) 将指定项设置为视图中的 CurrentItem
MoveCurrentToFirst() 将视图中的第一项设置为 CurrentItem
MoveCurrentToLast() 将视图中的最后一项设置为 CurrentItem
MoveCurrentToNext() 将视图中位于 CurrentItem 之后的项设置为 CurrentItem
MoveCurrentToPosition(Int32) 将位于指定索引位置的项设置为视图中的 CurrentItem
MoveCurrentToPrevious() 将视图中位于 CurrentItem 之前的项设置为 CurrentItem
Refresh() 重新创建该视图。

事件

CurrentChanged 在实现此接口时,在当前项改变之后引发此事件。
CurrentChanging 在实现此接口时,在改变当前项前引发此事件。 事件处理程序可以取消此事件。

如果在MVVM中不用ICollectonView的后果

如果我们不用ICollectionView,我们选中ListBox某一项,还必须跟SelectionChanged事件定义一个绑定方法来绑定Command,来处理事件(我们以MvvmLight的处理方式来处理Command),这里我们还要添加MvvmLight中的EventToCommand行为。代码如下

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <cmd:EventToCommand Command="{Binding SelectionChangedCommand, Mode=OneWay}" PassEventArgsToCommand="True"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

如果在MVVM中使用ICollecionView

上面的问题就很简单了,不需要添加SelectionChanged事件定义一个绑定方法来绑定Command,我们只需要使用ICollcetionView实例的CurrentItem就可以了,是不是简单了很多呢!ICollectionView除了当前选中项,还有分页、分组功能。可以用ListBox,Combox,DataGrid,DataPager等数据项控件.

简单案例

针对过滤,其实官方提供了一个解决方案,就是利用ICollectionView。该接口包含了一个Refresh方法,同时包含一个filter属性,该属性是用来过滤的,使用的时候,后台数据这么写:

public ICollectionView ViewSource { set; get; }

在ViewModel的构造方法里面这么写:

ViewSource = 
System.Windows.Data.CollectionViewSource.GetDefaultView(GlobalData.StatusList);
ViewSource.Filter = new Predicate<object>(OnFilterMovie);
bool OnFilterMovie(object item)
{
    if (CurrentType == "all") return true;
    else return (item as MovieModel).Type == CurrentType;
}

然后CurrentType属性这么写,当变更时,调用ViewSource的Refresh方法刷新一次数据

private string currentType = "all";
public string CurrentType
{
    get => currentType;
    set
    {
        if (currentType != value)
        {
            currentType = value;
            ViewSource.Refresh();
        }
    }
}

而前端绑定还按照普通绑定的方法写就可以了:

<DataGrid SelectedItem="{Binding SelectedItem}" ItemsSource="{Binding ViewSource}">
posted @ 2022-03-11 23:56  AJun816  阅读(1931)  评论(0编辑  收藏  举报