wpf mvvm datagrid数据过滤
datagrid数据过滤,你可以通过设置RowStyle属性,通过将Visibility绑定到ViewModel层的属性来控制是否可见,比如:
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Visibility">
<Setter.Value>
<MultiBinding Converter="{StaticResource DataGridRowVisibilityConverter}">
<Binding ElementName="dataGrid" Path="DataContext.CurrentType"/>
<Binding Path="Type"/>
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGrid.RowStyle>
这里我利用DataGridRowVisibilityConverter这个转换器,当CurrentType=“all”时所有的都显示,当CurrentType不是all时,要求datagrid数据源里面某个数据的Type值和CurrentType一致,才显示。
但是这样做有一个问题,就是当行的可见性变更后,数据并不会重刷,datagrid的row索引还是老的,需要手动刷新,但是我们是mvvm模式,没法手动刷新datagrid的数据。我暂时还没找到解决这个问题的方法。
针对过滤,其实官方提供了一个解决方案,就是利用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}" >
wpf mvvm datagrid数据过滤的更多相关文章
- wpf mvvm datagrid DataGridTemplateColumn的绑定无效的可能原因之一!
昨天在mvvm wpf的开发中遇到一个问题,绑定不起作用,编辑阶段没问题也没有提示找不到对应的绑定,但是在运行之后却不起作用,查了很多资料,说法不一,有些是要删除datagrid的一行,直接绑定del ...
- (WPF) MVVM: DataGrid Binding
Binding到DataGrid的时候,需要用到ObservableCollection. public ObservableCollection<Customer> Customers ...
- wpf mvvm datagrid 中button绑定命令方法
<DataGridTemplateColumn Header="设备状态" IsReadOnly="True" Width="150" ...
- WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对
WPF MVVM UI分离之<交互与数据分离> 在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...
- WPF的DataGrid绑定ItemsSource后第一次加载数据有个别列移位的解决办法
最近用WPF的DataGrid的时候,发现一个很弱智的问题,DataGrid的ItemsSource是绑定了一个属性: 然后取数给这个集合赋值的时候,第一次赋值,就会出现列移位 起初还以为是显卡的问题 ...
- WPF MVVM从入门到精通8:数据验证
原文:WPF MVVM从入门到精通8:数据验证 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 WPF M ...
- WPF的DataGrid控件从excel里复制数据然后粘贴
WPF的DataGrid控件不能像winform的DataGridView控件一样,支持值的粘贴.WPF的DataGrid控件本质上是跟数据绑定联系在一起,所以需要进行复制粘贴的操作,可以在wpf里用 ...
- WPF MVVM(Caliburn.Micro) 数据验证
书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model端验证,Model通过继承IDataErrorInfo接口来 ...
- WPF中DataGrid控件的过滤(Filter)性能分析及优化
DataGrid控件是一个列表控件, 可以进行过滤,排序等.本文主要针对DataGrid的过滤功能进行分析, 并提供优化方案. 1)DataGrid的过滤过程: 用户输入过滤条件 ...
随机推荐
- [Web Security] Create a hash salt password which can stored in DB
We cannot directly store user password in the database. What need to do is creating a hashed & s ...
- ASCII码的问题
数字0在ASCII的不同进制下表示:
- [Swift] Storyboard outlet and action
To programmaictlly change the content of app, we need to contect storyboard to a view controller. To ...
- Android 图片压缩,基于比例和质量压缩
package cc.util.android.image; import java.io.ByteArrayOutputStream; import java.io.File; import jav ...
- php中模拟多继承如何实现
php中模拟多继承如何实现 一.总结 一句话总结:其实你继承别人也是想调用别人类里面的方法和属性,所以可以这样做:这本类中创建目标类的对象,然后通过这个对象来调用方法和属性,这样比继承来的方便. 二. ...
- struts2-token防止重复提交解决办法
1.配置struts.xml全局防重复提交拦截器栈: <struts> <package name="module" extends="struts-d ...
- ios开发之核心动画四:核心动画-Core Animation--CABasicAnimation基础核心动画
#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutl ...
- rabbitMQ服务安装
1.rabbitMQ简介 1.1.rabbitMQ的优点(适用范围)1. 基于erlang语言开发具有高可用高并发的优点,适合集群服务器.2. 健壮.稳定.易用.跨平台.支持多种语言.文档齐全.3. ...
- [Grid Layout] Use the minmax function to specify dynamically-sized tracks
Using minmax() is an amazingly useful way to specify boundaries for the smallest and largest size a ...
- [Vue] Dynamic Vue.js Components with the component element
You can dynamically switch between components in a template by using the reserved <component> ...