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

WPF DataGrid如何获取编辑后最新值并在ViewModel中接收

解决WPF DataGrid RowEditEnding命令获取旧值及参数类型错误问题

问题分析

  1. 获取旧值:RowEditEnding事件触发时机早于DataGrid提交编辑值到绑定源,直接获取的实体是编辑前的旧数据。
  2. 参数类型错误:设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:27:46