WPF DataGrid如何获取编辑后最新值并在ViewModel中接收
解决WPF DataGrid RowEditEnding命令获取旧值及参数类型错误问题
问题分析
- 获取旧值:RowEditEnding事件触发时机早于DataGrid提交编辑值到绑定源,直接获取的实体是编辑前的旧数据。
- 参数类型错误:设置
PassEventArgsToCommand="True"后,InvokeCommandAction会传递DataGridRowEditEndingEventArgs作为命令参数,而非手动指定的SelectedItem,原命令方法的参数类型与实际传递的参数不匹配,导致转换错误。
解决方案
1. 修改XAML代码
移除CommandParameter,保留PassEventArgsToCommand="True",让事件参数直接传递给命令:
<DataGrid x:Name="BrugerDataGrid" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserSortColumns="False" IsReadOnly="False" SelectionMode="Single" SelectionUnit="FullRow" ItemsSource="{Binding Brugere, Mode=TwoWay}"> <i:Interaction.Triggers> <i:EventTrigger EventName="RowEditEnding"> <i:InvokeCommandAction Command="{Binding RowEditEndingCommand}" PassEventArgsToCommand="True" /> </i:EventTrigger> </i:Interaction.Triggers> <!-- DataGrid columns --> </DataGrid>
2. 修改ViewModel代码
调整命令的泛型参数为DataGridRowEditEndingEventArgs,并在方法中强制提交编辑以获取最新值:
using System.Windows.Controls; using System.Windows.Data; public ObservableCollection<Bruger> Brugere { get; set; } public ICommand RowEditEndingCommand => new RelayCommand<DataGridRowEditEndingEventArgs>(OnRowEditEnding); private void OnRowEditEnding(DataGridRowEditEndingEventArgs e) { // 仅处理提交编辑的情况 if (e.EditAction != DataGridEditAction.Commit) return; var editedRow = e.Row; // 强制提交编辑,将UI上的最新值同步到绑定的Bruger对象 editedRow.BindingGroup.CommitEdit(); // 获取编辑后的实体 if (editedRow.DataContext is Bruger updatedBruger) { // 此处可将updatedBruger存入数据库 // 示例:_dbContext.Brugere.Update(updatedBruger); // _dbContext.SaveChanges(); } }
如果你的RelayCommand仅支持object类型参数,可改为:
public ICommand RowEditEndingCommand => new RelayCommand<object>(OnRowEditEnding); private void OnRowEditEnding(object parameter) { if (parameter is not DataGridRowEditEndingEventArgs e || e.EditAction != DataGridEditAction.Commit) return; var editedRow = e.Row; editedRow.BindingGroup.CommitEdit(); if (editedRow.DataContext is Bruger updatedBruger) { // 处理最新值逻辑 } }
关键说明
- 强制提交编辑:调用
BindingGroup.CommitEdit()会让DataGrid立即将UI编辑框中的值同步到绑定的Bruger实体,确保获取到最新数据。 - 参数传递逻辑:
PassEventArgsToCommand="True"生效时,InvokeCommandAction会忽略手动设置的CommandParameter,直接传递事件的EventArgs对象,因此命令参数类型需与事件参数匹配。
内容的提问来源于stack exchange,提问作者kwangha
相关产品推荐
相关产品推荐

