原文: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数据过滤的更多相关文章

  1. wpf mvvm datagrid DataGridTemplateColumn的绑定无效的可能原因之一!

    昨天在mvvm wpf的开发中遇到一个问题,绑定不起作用,编辑阶段没问题也没有提示找不到对应的绑定,但是在运行之后却不起作用,查了很多资料,说法不一,有些是要删除datagrid的一行,直接绑定del ...

  2. (WPF) MVVM: DataGrid Binding

    Binding到DataGrid的时候,需要用到ObservableCollection. public ObservableCollection<Customer> Customers ...

  3. wpf mvvm datagrid 中button绑定命令方法

    <DataGridTemplateColumn Header="设备状态" IsReadOnly="True" Width="150" ...

  4. WPF MVVM UI分离之《交互与数据分离》 基础才是重中之重~delegate里的Invoke和BeginInvoke 将不确定变为确定系列~目录(“机器最能证明一切”) 爱上MVC3系列~全局异常处理与异常日志 基础才是重中之重~lock和monitor的区别 将不确定变成确定~我想监视我的对象,如果是某个值,就叫另一些方法自动运行 将不确定变成确定~LINQ DBML模型可以对

    WPF MVVM UI分离之<交互与数据分离>   在我们使用WPF过程中,不可避免并且超级喜欢使用MVVM框架. 那么,使用MVVM的出发点是视觉与业务逻辑分离,即UI与数据分离 诸如下 ...

  5. WPF的DataGrid绑定ItemsSource后第一次加载数据有个别列移位的解决办法

    最近用WPF的DataGrid的时候,发现一个很弱智的问题,DataGrid的ItemsSource是绑定了一个属性: 然后取数给这个集合赋值的时候,第一次赋值,就会出现列移位 起初还以为是显卡的问题 ...

  6. WPF MVVM从入门到精通8:数据验证

    原文:WPF MVVM从入门到精通8:数据验证 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 WPF M ...

  7. WPF的DataGrid控件从excel里复制数据然后粘贴

    WPF的DataGrid控件不能像winform的DataGridView控件一样,支持值的粘贴.WPF的DataGrid控件本质上是跟数据绑定联系在一起,所以需要进行复制粘贴的操作,可以在wpf里用 ...

  8. WPF MVVM(Caliburn.Micro) 数据验证

    书接前文 前文中仅是WPF验证中的一种,我们暂且称之为View端的验证(因为其验证规是写在Xaml文件中的). 还有一种我们称之为Model端验证,Model通过继承IDataErrorInfo接口来 ...

  9. WPF中DataGrid控件的过滤(Filter)性能分析及优化

    DataGrid控件是一个列表控件, 可以进行过滤,排序等.本文主要针对DataGrid的过滤功能进行分析, 并提供优化方案. 1)DataGrid的过滤过程:      用户输入过滤条件       ...

随机推荐

  1. 像Bootstrap一样比较热门的前端框架有哪些

    像Bootstrap一样比较热门的前端框架有哪些 一.总结 一句话总结:框架大同小异,可以多去各自官网看看效果(比较一下各自的不同点(也就是提供的不同的功能)),然后根据需求选择用哪个.我觉得boot ...

  2. 实现indexOf

    1.先判断Array数组是否含有indexOf方法,如果有直接返回结果:如果没有则利用循环比较得到结果. function indexOf(arr, item) { if(Array.prototyp ...

  3. OC学习篇之---Foundation框架中的NSArray类和NSMutableArray类

    我们继续来看一下Foundation框架中的NSArray类和NSMutableArray类,其实NSArray类和Java中的List差不多,算是一种数据结构,当然我们从这两个类可以看到,NSArr ...

  4. PHP 分布式集群中session共享问题以及session有效期的设置

    https://blog.csdn.net/m_nanle_xiaobudiu/article/details/81177698

  5. 【习题 5-11 UVA 12504 】Updating a Dictionary

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 不确定某个map里面是否有某个关键字的时候. 要用find来确定. 如果直接用访问下标的形式去做的话. 会强行给他加一个那个关键字( ...

  6. [AngularFire 2] Joins in Firebase

    Lets see how to query Firebase. First thing, when we do query, 'index' will always help, for both SQ ...

  7. C++ 宏、范型和RTTI 浅析

    [摘要]        RTTI(Run-Time Type Identification)是面向对象程序设计中一种重要的技术. 现行的C++标准对RTTI已经有了明白的支持. 只是在某些情况下出于特 ...

  8. JScript使用正则表达式的经验

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在JScript使用正则表达式时有不少元字符在试图对其进行匹配时需要进行特殊的处理.要匹配这些特殊字符,必须首先将这些 ...

  9. 线程堆栈大小 pthread_attr_setstacksize 的使用

    pthread_create 创建线程时,若不指定分配堆栈大小,系统会分配默认值,查看默认值方法如下: # ulimit -s8192# 上述表示为8M:单位为KB. 也可以通过# ulimit -a ...

  10. Windows7-32位系统下R语言链接mySQL数据库步骤

    安装R和MySQL在此就不再多说了.网上有非常多教程能够找到.以下直接进入到odbc的安装流程. 1.下载安装mysql-connector-odbc-5.x.x-win32.msi 下载地址:htt ...