最近的一个项目是用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 = ; i < ; i++)
{
model = new MainModel();
model.Xh = i;
model.Name = "李雷" + i;
model.Age = + 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())
{
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 < ) return;
DataGridBaseInfo.ToList().FindAll(p => p.IsSelected = true);
} private bool CanExecuteSelectAllCommand()
{
if (DataGridBaseInfo != null)
{
return DataGridBaseInfo.Count > ;
}
else
return false;
} /// <summary>
/// 取消全部选中
/// </summary>
private RelayCommand unSelectAllCommand; public RelayCommand UnSelectAllCommand
{
get { return unSelectAllCommand ?? (unSelectAllCommand = new RelayCommand(ExecuteUnSelectAllCommand, CanExecuteUnSelectAllCommand)); }
} private void ExecuteUnSelectAllCommand()
{
if (DataGridBaseInfo.Count < )
return;
if (DataGridBaseInfo.ToList().FindAll(p => p.IsSelected == false).Count != )
IsSelectAll = false;
else
DataGridBaseInfo.ToList().FindAll(p => p.IsSelected = false);
} private bool CanExecuteUnSelectAllCommand()
{
if (DataGridBaseInfo != null)
{
return DataGridBaseInfo.Count > ;
}
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

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

代码

MVVM框架下,WPF实现Datagrid里的全选和选择的更多相关文章

  1. MVVM框架下 WPF隐藏DataGrid一列

    最近的一个项目,需要在部分用户登录的时候,隐藏DataGrid中的一列,但是常规的绑定不好使,在下面举个例子. XAML部分代码 <Window x:Class="DataGridCo ...

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

    MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...

  3. MVVM模式下WPF动态绑定展示图片

    MVVM模式下WPF动态展示图片,界面选择图标,复制到项目中固定目录下面,保存到数据库的是相对路径,再次读取的时候是根据数据库的相对路径去获取项目中绝对路径的图片展示. 首先在ViewModel中 / ...

  4. easyui datagrid里的复选框置灰方法

    easyui datagrid里的复选框置灰方法: $('.datagrid input').prop('disabled',true);//复选框置灰

  5. wpf DataGrid CheckBox列全选

    最近在wpf项目中遇到当DataGrid的header中的checkbox选中,让该列的checkbox全选问题,为了不让程序员写自己的一堆事件,现写了一个自己的自定义控件 在DataGrid的 &l ...

  6. WPF MVVM框架下,VM界面写控件

    MVVM正常就是在View页面写样式,ViewModel页面写逻辑,但是有的时候纯在View页面写样式并不能满足需求.我最近的这个项目就遇到了,因此只能在VM页面去写样式控件,然后绑定到View页面. ...

  7. 关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列

    最近在做一个组态软件的项目,有一个需求需要在建立IO设备变量的时候选择变量的类型等. 建立IO变量的界面是一个DataGrid实现的,可以一行一行的新建变量,如下如所示: 这里需要使用带有ComboB ...

  8. mvvm框架下页面与ViewModel的各种参数传递方式

    传单个参数的话在xaml用     Command={Binding ViewModel的事件处理名称}    CommandParameter={Binding 要传递的控件名称} ViewMode ...

  9. 【WPF】一组CheckBox的全选/全不选功能

    需求:给一组CheckBox做一个全选/全不选的按钮. 思路:CheckBox不像RadioButton那样拥有GroupName属性来分组,于是我想的方法是将这组CheckBox放到一个布局容器中, ...

随机推荐

  1. NAIPC-2016

    A. Fancy Antiques 爆搜+剪枝. #include <bits/stdc++.h> using namespace std ; typedef pair < int ...

  2. python常用模块json、os、sys

    一.序列化 json & pickle 模块 json--用于字符串和Python数据类型间进行转换 pickle---用于python特有的类型和Python的数据类型间进行转换 json: ...

  3. 批量设置select为默认项

    app.$form.find("select").prop("selectedIndex", 0);

  4. weex逻辑控制

    在WEEX中,有if 和 repeat 两种逻辑运算,需要注意的是,逻辑控制不能够作用于<template>这样的根节点. if 控制判断条件true/false直接对节点进行操作,if= ...

  5. Python3.5 Day1作业:实现用户密码登录,输错三次锁定。

    作业需求: 1.输入用户名密码 2.认证成功后显示欢迎信息 3.输错三次后锁定 实现思路: 1.判断用户是否在黑名单,如果在黑名单提示账号锁定. 2.判断用户是否存在,如果不存在提示账号不存在. 3. ...

  6. OpenSceneGraph 笔记--如何导出三角形数据

    OpenSceneGraph 笔记--如何导出三角形数据 转载:http://blog.csdn.net/pizi0475/article/details/5384389 在OpenSceneGrap ...

  7. C#委托与事件的简单使用

    前言:上一篇博文从原理和定义的角度介绍了C#的委托和事件.本文通过一个简单的小故事,来说明C#委托与事件的使用方法及其方便之处. 在阅读本文之前,需要你对委托和事件的基本概念有所了解.如果你是初次接触 ...

  8. zabbix监控报错zabbix server is not running解决方法

    问题描述: 布置好zabbix监控,正常运行.但是重启了虚拟机服务器之后,页面出现如下的报错,而且设置的报信息也是失效的:

  9. 关于“模仿"和”创新“

    互联网刚刚进入中国的前10年,国内互联网企业基本处于模仿和学习阶段.三大门户新浪.搜狐和网易,师从雅虎:现在如日中天的BAT三巨头,百度学习谷歌.阿里巴巴学习亚马逊和EBAY.腾讯学习ICQ. 关于模 ...

  10. 【LabVIEW技巧】路径依赖解除方法

    前言 LabVIEW程序开发,让我们的程序设计变的简单容易,但是设计过程中也不乏大量的重复性工作,其中最让人头痛的莫过于依赖冲突问题. 事实上,只要你对文件进行了修改或者移动,必不可少的依赖冲突就会产 ...