You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在用户点击按钮时完成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:14:53