WPF DataGrid编辑后如何将更改同步回ViewModel的DataTable源属性
DataGrid编辑内容同步回ViewModel中DataTable的最优方案
首先明确核心逻辑:DataTable是引用类型,只要绑定路径正确,DataGrid编辑的内容默认已经直接写入ViewModel的DataTable实例,不需要额外的整体替换同步,你遇到的无法拿到修改的问题,90%是编辑提交时机未到或者绑定配置错误导致的,以下是最优解决方案:
1. 修正绑定配置,确保编辑即时提交
DataGrid默认的编辑提交规则是:只有当焦点离开当前编辑的整行时,才会把修改写入绑定的DataRow。如果你需要单元格编辑完成后立刻回写,修改绑定的UpdateSourceTrigger即可:
手动定义列场景
直接在列的Binding中指定参数:
<DataGridTextColumn Header="姓名" Binding="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
自动生成列场景
给DataGrid添加AutoGeneratingColumn事件处理,统一修改所有列的绑定规则:
<DataGrid ItemsSource="{Binding StudentsTable, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:StudentsGrid}}}" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"/>
后台事件代码:
private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { if (e.Column is DataGridBoundColumn boundColumn) { var binding = boundColumn.Binding as Binding; if (binding != null) { binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; } } }
注意:DataGrid的ItemsSource不需要设置
Mode=TwoWay,该属性只在整个集合实例替换时生效,你修改的是集合内的行数据,不需要双向绑定。
2. 主动触发未完成编辑的提交
如果你的业务场景需要在编辑未结束(比如用户还在编辑某一行,没切走焦点)时就拿到最新修改,调用DataGrid的CommitEdit方法强制提交即可:
// 提交所有未提交的编辑内容 YourDataGrid.CommitEdit(DataGridEditingUnit.Row, true);
你可以把这个逻辑封装到自定义控件的公开方法里,在ViewModel需要读取最新数据前调用即可。
3. 验证修改是否已同步的测试方法
你可以在ViewModel中加测试代码确认修改已存在,不需要额外同步逻辑:
// 调用该方法,如果返回不为null,说明DataTable已经拿到了所有修改 public DataTable GetChangedData() { return _Table.GetChanges(); }
可选优化:修正依赖属性的隐患
你当前的StudentsTable依赖属性默认值设为new DataTable(),会导致所有未显式绑定该属性的控件实例共享同一个DataTable,建议修改为:
public static readonly DependencyProperty StudentsTableProperty = DependencyProperty.Register("StudentsTable", typeof(DataTable), typeof(StudentsGrid), new PropertyMetadata(null, StudentsTablePropertyChanged));
内容的提问来源于stack exchange,提问作者Divyanshu Agarwal
相关产品推荐
相关产品推荐

