.NET 6 WPF中DataContext绑定自定义类值同步异常求助
.NET 6 WPF中DataContext赋值后默认值与修改值无法区分的问题解决
问题场景
使用.NET 6开发WPF程序时,遇到如下问题:将自定义类实例赋值给窗口的DataContext后,保存操作无法区分原始值和用户修改后的值。传入EditImage窗口的实际是expandedclass(customclass的子类)实例,但无论窗口内绑定的属性如何修改,用于存储原始值的defaultvalue和从DataContext取出的editedvalue属性值始终一致,导致判断修改的逻辑分支永远无法进入。
原始代码
EditImage窗口代码
public partial class EditImage : Window { public bool closed = false; customclass defaultvalue = new customclass(); public EditImage(customclass inputvalue) { InitializeComponent(); // 赋值DataContext this.DataContext = inputvalue; defaultvalue = inputvalue; } // 绑定到Office变量的CheckBox,点击保存按钮触发 private void btn_Save_Click(object sender, RoutedEventArgs e) { var editedvalue = this.DataContext as customclass; // 如果窗口内有修改,执行对应逻辑 if ((defaultvalue.Office != editedvalue.Office) { // 永远进不来,因为defaultvalue和editedvalue数据始终一致 } } }
自定义类定义
public partial class customclass { public int ID {get; set;} public string Articlenumber {get; set;} public bool Office {get; set;} } internal class expandedclass : customclass { public DateTime Created {get; set;} public bool Deprecated {get; set;} }
问题原因
defaultvalue = inputvalue属于引用赋值,这意味着defaultvalue和inputvalue指向内存中的同一个对象。当用户通过WPF绑定修改DataContext内的属性时,实际修改的就是这个共享对象的属性值,因此对比时两者的属性必然完全一致。调整赋值顺序、设置static/readonly修饰符或者强制类型转换,都无法改变两个变量指向同一对象的本质。
可行解决方案(AutoMapper实现)
通过AutoMapper创建原始对象的深拷贝,让DataContext指向这个独立的拷贝对象。这样原始值defaultvalue会始终保留初始状态,用户的修改操作只会影响拷贝对象,就能正常对比原始值和修改后的值。
using AutoMapper; customclass defaultvalue; public EditImage(customclass inputvalue) { InitializeComponent(); defaultvalue = inputvalue; MapperConfiguration config = new MapperConfiguration(cfg => cfg.CreateMap<customclass, customclass>()); Mapper mapper = new Mapper(config); var changablevalue = mapper.Map<customclass>(inputvalue); // 赋值DataContext this.DataContext = changablevalue; }
内容的提问来源于stack exchange,提问作者Teim0
相关产品推荐
相关产品推荐

