WPF DataGrid 数据过滤
WPF DataGrid 数据过滤
ICollectionView
使集合具有当前记录管理、自定义排序、筛选和分组功能。
- 它的 SortDescriptions、GroupDescription 等属性会影响视图的结构,一般情况下会自动刷新。
- 也可以直接使用 Refresh 方法来命令视图的刷新(内部实现一般为重建内部视图模型集合)。
- 如果是批量操作,也可以使用 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}">
登峰造极的成就源于自律