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

如何在独立窗口编辑DataGrid且禁止自动更新

解决WPF编辑窗口实时同步DataGrid数据的问题

在WPF项目中,MainWindow内有一个只读的DataGrid,通过自定义类型Material的列表填充数据。目前实现了通过独立窗口(带TextBox)编辑单行数据,但编辑窗口中修改TextBox内容时,DataGrid会实时同步更新。需求是:点击保存按钮并验证新值通过后,再更新DataGrid中的数据。

核心原因

当前编辑窗口直接绑定了DataGrid选中对象的原引用,任何修改都会实时同步到原对象,进而触发DataGrid自动更新。解决方案是创建选中对象的克隆副本,在编辑窗口中修改副本,验证通过后再将副本的值同步回原对象。


步骤1:为Material类添加克隆方法

给Material类实现克隆逻辑,复制所有属性生成新对象:

public class Material : INotifyPropertyChanged // 假设已实现INotifyPropertyChanged接口
{
    // 现有属性定义
    public int Posicion { get; set; }
    public int IdMaterial { get; set; }
    public decimal Cantidad { get; set; }
    public decimal Ancho { get; set; }
    public decimal Alto { get; set; }
    public DateTime FechaLote { get; set; }
    public string Lote { get; set; }
    public string Proveedor { get; set; }

    // 添加克隆方法
    public Material Clone()
    {
        return new Material
        {
            Posicion = this.Posicion,
            IdMaterial = this.IdMaterial,
            Cantidad = this.Cantidad,
            Ancho = this.Ancho,
            Alto = this.Alto,
            FechaLote = this.FechaLote,
            Lote = this.Lote,
            Proveedor = this.Proveedor
            // 复制所有需要编辑的属性
        };
    }

    // INotifyPropertyChanged接口实现代码...
}

步骤2:修改打开编辑窗口的代码

传递选中对象的克隆体,而非原引用:

private void btnModificarLinea_Click(object sender, RoutedEventArgs e)
{
    if (dgCb.SelectedItem == null)
    {
        MessageBox.Show("No se ha seleccionado ninguna línea.");
        return;
    }

    string pathCodigos = Properties.Settings.Default.RutaCodigos;
    Material selectedMaterial = (Material)dgCb.SelectedItem;

    ModificarStock wModificarStock = new ModificarStock();
    wModificarStock.Tipo = ModificarStock.TipoModificacion.Modificar;
    // 传递克隆对象,避免修改实时同步到原DataGrid
    wModificarStock.LineaStock = selectedMaterial.Clone();
    wModificarStock.Codigos = CodigosMaterial.ObtenerCodigos(pathCodigos, ';');
    // 传递原对象到关闭事件,用于后续同步数据
    wModificarStock.Closed += (s, args) => ModificarStock_Closed(s, args, selectedMaterial);
    wModificarStock.ShowDialog();
}

步骤3:同步验证后的副本数据

新增或修改窗口关闭事件,确认修改后将副本值同步回原对象:

private void ModificarStock_Closed(object sender, EventArgs e, Material originalMaterial)
{
    ModificarStock editWindow = (ModificarStock)sender;
    if (editWindow.CambioAceptado)
    {
        // 将验证通过的副本属性同步回原对象
        originalMaterial.IdMaterial = editWindow.LineaStock.IdMaterial;
        originalMaterial.Cantidad = editWindow.LineaStock.Cantidad;
        originalMaterial.Ancho = editWindow.LineaStock.Ancho;
        originalMaterial.Alto = editWindow.LineaStock.Alto;
        originalMaterial.FechaLote = editWindow.LineaStock.FechaLote;
        originalMaterial.Lote = editWindow.LineaStock.Lote;
        originalMaterial.Proveedor = editWindow.LineaStock.Proveedor;

        // 若Material未实现INotifyPropertyChanged,手动刷新DataGrid
        // dgCb.Items.Refresh();
    }
}

步骤4:编辑窗口代码无需修改

原ModificarStock窗口的绑定逻辑保持不变,因为它操作的是克隆对象,修改不会影响原DataGrid的数据,只有在验证通过后才会同步到原对象。


内容的提问来源于stack exchange,提问作者Garflik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:24:51