最近的一个项目是用MVVM实现,在实现功能的时候,就会有一些东西,和以前有很大的区别,项目中就用到了常用的序号,就是在Datagrid里的一个字段,用checkbox来实现。

既然是MVVM,就要用到ModleView,View和Model三层。

先看一下效果

当然,也可以确定是哪一项被选中了,这个代码里有。

实现这个全选功能,用到了三个DLL文件,分别为GalaSoft.MvvmLight.Extras.WPF4.dll,GalaSoft.MvvmLight.WPF4.dll,System.Windows.Interactivity.dll

Model曾需要实现INotifyPropertyChanged接口,以方便向客户端通知属性被更改了

public class MainModel:INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;private void INotifyPropertyChanged(string name){if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs(name));}}private int xh;public int Xh{get { return xh; }set { xh = value; }}private string name;public string Name{get { return name; }set { name = value;INotifyPropertyChanged("Name");}}private int age;public int Age{get { return age; }set { age = value;INotifyPropertyChanged("Age");}}private bool isSelected;public bool IsSelected{get { return isSelected; }set { isSelected = value;INotifyPropertyChanged("IsSelected");}}}

Model

Model层里除了Datagrid里显示的序号,姓名和年龄意外,还有一个就是IsSelected,是用来确定是否选中的。

ViewModel层继承ViewModelBase,它来自GalaSoft.MvvmLight命名空间,重点是用到了里面的RaisePropertyChanged

全选的checkbox和下面选中的checkbox是分开来写的,各自有各自的Command,选中和不选中都有,IsSelectAll是用来标识是不是全选中

public class MainViewModel : ViewModelBase{public MainViewModel(){DataGridBaseInfo = AddDataGridInfo();}/// <summary>/// 给Datagrid绑定的属性/// </summary>private List<MainModel> dataGridBaseInfo;public List<MainModel> DataGridBaseInfo{get { return dataGridBaseInfo; }set{dataGridBaseInfo = value;RaisePropertyChanged("DataGridBaseInfo");}}/// <summary>/// 显示按钮/// </summary>private RelayCommand buttonCommand;public RelayCommand ButtonCommand{get{return buttonCommand ?? (buttonCommand = new RelayCommand(() =>{int count = DataGridBaseInfo.ToList().FindAll(p => p.IsSelected == true).Count;MessageBox.Show("选中了" + count + "项");//for (int i = 0; i < count; i++)//    MessageBox.Show(DataGridBaseInfo.ToList().FindAll(p=>p.IsSelected==true)[i].Name + "," + DataGridBaseInfo.ToList().FindAll(p=>p.IsSelected==true)[i].Age);
                    }));}            }public List<MainModel> AddDataGridInfo(){MainModel model;List<MainModel> list = new List<MainModel>();for (int i = 0; i < 5; i++){model = new MainModel();model.Xh = i;model.Name = "李雷" + i;model.Age = 20 + i;list.Add(model);}return list;}/// <summary>/// 选中/// </summary>private RelayCommand selectCommand;public RelayCommand SelectCommand{get{return selectCommand ?? (selectCommand = new RelayCommand(() =>{int selectCount = DataGridBaseInfo.ToList().Count(p => p.IsSelected == false);if (selectCount.Equals(0)){IsSelectAll = true;}}));}}/// <summary>/// 取消选中/// </summary>private RelayCommand unSelectCommand;public RelayCommand UnSelectCommand{get{return unSelectCommand ?? (unSelectCommand = new RelayCommand(() =>{IsSelectAll = false;}));}}private bool isSelectAll = false;public bool IsSelectAll{get { return isSelectAll; }set{isSelectAll = value;RaisePropertyChanged("IsSelectAll");}}/// <summary>/// 选中全部/// </summary>private RelayCommand selectAllCommand;public RelayCommand SelectAllCommand{get{return selectAllCommand ?? (selectAllCommand = new RelayCommand(ExecuteSelectAllCommand, CanExecuteSelectAllCommand));}}private void ExecuteSelectAllCommand(){if (DataGridBaseInfo.Count < 1) return;DataGridBaseInfo.ToList().FindAll(p => p.IsSelected = true);}private bool CanExecuteSelectAllCommand(){if (DataGridBaseInfo != null){return DataGridBaseInfo.Count > 0;}elsereturn false;}/// <summary>/// 取消全部选中/// </summary>private RelayCommand unSelectAllCommand;public RelayCommand UnSelectAllCommand{get { return unSelectAllCommand ?? (unSelectAllCommand = new RelayCommand(ExecuteUnSelectAllCommand, CanExecuteUnSelectAllCommand)); }}private void ExecuteUnSelectAllCommand(){if (DataGridBaseInfo.Count < 1)return;if (DataGridBaseInfo.ToList().FindAll(p => p.IsSelected == false).Count != 0)IsSelectAll = false;elseDataGridBaseInfo.ToList().FindAll(p => p.IsSelected = false);}private bool CanExecuteUnSelectAllCommand(){if (DataGridBaseInfo != null){return DataGridBaseInfo.Count > 0;}else{return false;}}}

ViewModel

View层需要 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" ,xmlns:Custom="http://www.galasoft.ch/mvvmlight" 两个命名空间

由于序号是绑定过来的,因此是用了stackpanel把checkbox和label放到了一起

<Grid><Grid.RowDefinitions><RowDefinition Height="20"/><RowDefinition Height="*"/><RowDefinition Height="20"/></Grid.RowDefinitions><DataGrid Grid.Row="1" ItemsSource="{Binding DataGridBaseInfo, Mode=TwoWay}" Margin="10" AutoGenerateColumns="False"><DataGrid.Columns>                <DataGridTemplateColumn><DataGridTemplateColumn.Header><CheckBox Content="全选" IsChecked="{Binding IsSelectAll,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"><i:Interaction.Triggers>                                <i:EventTrigger EventName="Checked"><Custom:EventToCommand Command="{Binding DataContext.SelectAllCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" CommandParameter="{Binding IsSelectAll, ElementName=qx}"/></i:EventTrigger><i:EventTrigger EventName="Unchecked"><Custom:EventToCommand Command="{Binding DataContext.UnSelectAllCommand,  RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" CommandParameter="{Binding IsSelectAll, ElementName=qx}"/></i:EventTrigger>                                </i:Interaction.Triggers></CheckBox></DataGridTemplateColumn.Header><DataGridTemplateColumn.CellTemplate>                        <DataTemplate><StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"><CheckBox x:Name="cbXh"  VerticalAlignment="Center" IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"><i:Interaction.Triggers><i:EventTrigger EventName="Checked"><Custom:EventToCommand Command="{Binding DataContext.SelectCommand, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" CommandParameter="{Binding IsChecked, ElementName=cbXh}"/></i:EventTrigger><i:EventTrigger EventName="Unchecked"><Custom:EventToCommand Command="{Binding DataContext.UnSelectCommand,  RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" CommandParameter="{Binding IsChecked, ElementName=cbXh}"/></i:EventTrigger></i:Interaction.Triggers></CheckBox><Label Content="{Binding Xh}" FontSize="14"/></StackPanel></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn>                <DataGridTextColumn Header="姓名" Binding="{Binding Name}" Width="*"/><DataGridTextColumn Header="年龄" Binding="{Binding Age}" Width="*"/></DataGrid.Columns>            </DataGrid><Button Content="显示" Grid.Row="2" Width="50" Command="{Binding ButtonCommand}"/></Grid>

View

当时实现这个功能的时候也花了不少时间,希望给需要的人一点帮助。

代码

转载于:https://www.cnblogs.com/ZXdeveloper/p/4609079.html

MVVM框架下,WPF实现Datagrid里的全选和选择相关推荐

  1. MVVM框架从WPF移植到UWP遇到的问题和解决方法

    MVVM框架从WPF移植到UWP遇到的问题和解决方法 参考文章: (1)MVVM框架从WPF移植到UWP遇到的问题和解决方法 (2)https://www.cnblogs.com/durow/p/48 ...

  2. easyui datagrid 控件全选

    easyui datagrid 控件全选 在datagrid控件中全选功能都是easyUI给做好的,只需要将负责全选的复选框设置下面的这个属性为false属性即可全部选中 singleSelect:f ...

  3. easyUI table datagrid 选中取消全选触发事件

    业务中可能会需要实时的监听表格中的行勾选事件来实现一些需求,根据 easyUI 绑定table id,datagrid 选中取消全选触发事件. 需要注意的是,将.datagrid方法放在$(funct ...

  4. C# WPF MVVM框架下 ,如何实现listBox图片排列

    在C#中实现如图的功能 view的代码 <base:BaseView x:Class="Luman.Tdrc.SampleModule.Test.GaoTest.DemoListPic ...

  5. Flex利用Datagrid来设置全选和单选

    1,效果预览图: 2,设置一个状态位,用于checkbox的选择的,从后台获取的对象集合ArrayCollection.假如其对象为Expert,有属性mainid,tname,major,depar ...

  6. C# wpf中DataGrid 支持汇总行

    最近有一个需求,需要汇总金额,份额等字段.我们使用的是原生的WPF控件,自己开发了一套Template.而没有使用比较成熟的第三方控件.所以这个功能得自己开发.并且要做成控件层次的功能. 当然也可以这 ...

  7. html 属于mvvm框架,mvvm模式和mvc的区别是什么?

    一.什么是MVVM? 在MVVM框架下视图和模型是不能直接通信的,只能通过ViewModel进行交互,它能够监听到数据的变化,然后通知视图进行自动更新,而当用户操作视图时,VM也能监听到视图的变化,然 ...

  8. easyui datagrid reload后自动全选解决

    easyui datagrid reload(刷新)后自动全选了 // 加载成功后 onLoadSuccess:function(){ dg.datagrid("uncheckAll&quo ...

  9. el-select 下拉框多选实现全选

    在写一个功能时发现el-select支持多选,但是竟然不支持全选,好无语哦,那就自己实现一下吧~有两种方法,第二种感觉简单些 方法一:下拉项增加一个[全选],然后应该有以下几种情况: 1.下拉选项全都 ...

最新文章

  1. 201403-4 无线网络
  2. 几种主流的分布式定时任务,你知道哪些?
  3. mysql主从切换(正常切换)
  4. java chinapay_通过PHP/Java Bridge来实现ecshop的chinapay支付接口
  5. mac怎么用python2和3_Mac同时安装python2和python3
  6. CodeForces - 1332B Composite Coloring(数论+构造)
  7. select 选择器php,php – 选择laravel 5.4中下拉列表的选定值
  8. python气象数据处理与绘图_Python气象数据处理与绘图:纬高图的另一种思路
  9. CSO全球网络安全大会来了,权威奖项征集中
  10. PHP SESSION生存时间设置
  11. [微积分] 常用定义与公式
  12. IOError: encoder jpeg not available
  13. Java程序低手之关于泛型(Generic)
  14. MicrosoftActiveSync 安装
  15. Flash实例教程:AS3代码简单表现照片底片效果
  16. 都说数据是资产,那么到底什么是数据资产?
  17. IOS TableViewCell分割线设置和隐藏多余cell
  18. 自定义View进阶-手绘地图(二)
  19. FPGA:什么是IO单元、IO标准、Bank、VCCO、VREF
  20. 认识控制台-什么是控制台?

热门文章

  1. layui table 弹出层刷新_layui 关闭open弹出框 刷新table表格页面的方法
  2. laravel的carbon日期函数创建指定的now()日期以及遇到的一些坑
  3. 每天一个linux命令(29):chgrp命令
  4. python【蓝桥杯vip练习题库】ALGO-66字符串编辑
  5. python【蓝桥杯vip练习题库】BASIC-6杨辉三角形
  6. 全卷积神经网路【U-net项目实战】肺结节分割案例分析:DSB3Tutorial
  7. connect time out 获取token失败_Power Query之获取钉钉日志自动刷新Power BI报告
  8. 品牌网络推广方案浅析在编写文章标题时都有什么技巧?
  9. 细节定成败!汕头网络推广提醒你在做网站内容收录时需注意什么?
  10. 网络营销外包——网络营销外包新手如何理解优化对网络营销的重要性?