如何在用户点击按钮时完成WPF DataGrid单元格编辑?
解决WPF DataGrid编辑状态下点击按钮丢失数据的问题
当DataGrid单元格处于编辑状态时,直接点击按钮不会自动提交编辑,导致绑定的数据源无法获取最新输入值,甚至出现整行数据为null的情况。可以通过强制提交编辑会话解决这个问题:
核心解决方案
在按钮点击事件的开头,调用DataGrid的CommitEdit方法,依次提交单元格和行的编辑状态,确保所有修改同步到ViewModel:
private void export_Click(object sender, RoutedEventArgs e) { // 强制提交单元格编辑,参数true表示即使验证失败也提交(可根据需求调整) dataGrid.CommitEdit(DataGridEditingUnit.Cell, true); // 提交行编辑,确保整行数据同步到数据源 dataGrid.CommitEdit(DataGridEditingUnit.Row, true); // 原有的导出逻辑保持不变 for (int i = 0; i < viewModel.CellData.Count; i++) { for (int j = 0; j < viewModel.CellData[i].Count; j++) { if (null == viewModel.CellData[i][j].Value) Debug.WriteLine("cell value at ({0},{1}) is null", i, j); else Debug.WriteLine("cell value at ({0},{1}) is {2}", i, j, viewModel.CellData[i][j].Value); } } }
原理说明
WPF DataGrid默认仅在焦点离开编辑单元格时自动提交编辑,将输入值同步到绑定的数据源。如果直接点击按钮,焦点仍停留在编辑的单元格内,编辑会话未结束,此时数据源无法获取最新输入,甚至会因为编辑模板的临时状态导致整行数据显示为null。通过主动调用CommitEdit,可以强制结束当前编辑会话,确保所有修改被持久化到ViewModel。
备选方案(可选)
如果不想调用CommitEdit,也可以通过让按钮获取焦点触发DataGrid自动结束编辑:
private void export_Click(object sender, RoutedEventArgs e) { // 让按钮获得焦点,触发DataGrid自动提交编辑 (sender as Button).Focus(); // 后续导出逻辑... }
这种方式依赖焦点变化的默认行为,不如CommitEdit直接可控,推荐优先使用第一种方案。
内容的提问来源于stack exchange,提问作者serialhobbyist
相关产品推荐
相关产品推荐

