WinForm MVVM模式下如何将DataGridView复选框绑定到ViewModel方法
WinForm MVVM模式下DataGridView复选框绑定实现方案
实现核心思路
完全不需要让ViewModel访问View层控件,只需要把复选框的选中状态和行对应的数据实体属性做双向绑定即可,所有判断逻辑直接操作ViewModel中的数据源即可实现需求。
具体实现步骤
- 第一步:修改行数据对应的
Item类,新增选中状态属性
你的DataGridView绑定的是ApplicationModel中的ItemList,因此给Item类添加支持属性变更通知的IsSelected字段:
public class Item : BindableBase { private bool _isSelected; public bool IsSelected { get => _isSelected; set => SetProperty(ref _isSelected, value); } // 原有Item类的其他属性保留即可 }
- 第二步:配置DataGridView的复选框列绑定
在View层的代码或者设计器中,把DataGridView的复选框列的DataPropertyName属性设置为IsSelected,这样用户勾选/取消勾选复选框时,状态会自动同步到ItemList中对应Item的IsSelected属性,无需额外编写事件代码。
如果用代码添加列,示例如下:
DataGridViewCheckBoxColumn checkBoxColumn = new DataGridViewCheckBoxColumn(); checkBoxColumn.Name = "选择列"; checkBoxColumn.DataPropertyName = "IsSelected"; // 和Item的属性名对应 dataGridView1.Columns.Insert(0, checkBoxColumn); // 其余列正常绑定即可 dataGridView1.DataSource = viewModel.Model.ItemList;
- 第三步:在ViewModel的按钮执行函数中直接判断选中状态
不需要访问任何View控件,直接遍历ItemList筛选IsSelected为true的项即可,修改后的执行函数参考如下:
private void ExecuteCreateSofwareQualityReportButtonClick() { // 新增:获取所有勾选的项,按需求执行对应逻辑即可 var selectedItems = ItemList.Where(i => i.IsSelected).ToList(); if (!selectedItems.Any()) { // 可添加未勾选的提示逻辑,按需调整 return; } // 示例逻辑:勾选第一个复选框时执行对应操作 if (selectedItems.Contains(ItemList.First())) { // 执行你需要的对应函数 } OpenFileDialog OpenExcel = new OpenFileDialog() { Title = "Save Excel File", CheckPathExists = true, DefaultExt = "xls", Filter = "Excel files (*.xls)|*.xls", FilterIndex = 1, RestoreDirectory = true }; if (OpenExcel.ShowDialog() == DialogResult.OK) { Microsoft.Office.Interop.Excel.Application xlApp; Microsoft.Office.Interop.Excel.Workbook xlWorkBook; xlApp = new Microsoft.Office.Interop.Excel.Application(); xlWorkBook = xlApp.Workbooks.Open(OpenExcel.FileName); // 可结合选中的项处理Excel数据 foreach (var item in selectedItems) { // 按需求写入Excel内容 } //Excel application is stopped and the process is killed CloseExcelProcess(xlWorkBook, xlApp); } }
可选优化(符合MVVM规范)
当前你把OpenFileDialog写在ViewModel中不符合MVVM分层原则,可将对话框逻辑封装成接口注入到ViewModel中,避免ViewModel依赖View层的UI组件。
内容的提问来源于stack exchange,提问作者CoderNoob
相关产品推荐
相关产品推荐

