如何在独立窗口编辑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
相关产品推荐
相关产品推荐

