在C# WPF中如何对单个对象实例进行数据绑定?
问题原因
核心问题是C#引用类型的赋值逻辑,和WPF数据绑定本身没有关系
你代码中的Current和Start都属于引用类型变量,直接赋值Start = source时,并没有创建新的对象实例,只是把Start的指针指向了和source、Current完全相同的堆内存地址。你通过绑定修改Current的属性时,本质修改的是同一个实例的属性,所以访问Start的属性自然会和Current完全一致。
解决方案
- 方案1:浅拷贝(适合实体仅包含值类型、string等不可变类型属性的场景)
给你的业务实体类实现拷贝构造函数,不需要依赖额外序列化组件,示例如下:
// 你的自定义业务实体类 public class YourBusinessEntity { public string ObjectTextProperty { get; set; } public int Id { get; set; } // 其他属性... // 拷贝构造函数 public YourBusinessEntity(YourBusinessEntity other) { ObjectTextProperty = other.ObjectTextProperty; Id = other.Id; // 逐个赋值其他属性 } }
修改页面构造函数的赋值逻辑:
public PageUpdate(YourBusinessEntity source) { InitializeComponent(); Current = source; Start = new YourBusinessEntity(source); // 现在两个变量指向独立的实例 }
- 方案2:深拷贝(适合实体包含嵌套引用类型属性的场景)
通过序列化反序列化的方式快速实现全属性拷贝,不需要手动逐个复制属性,示例如下:
// 通用深拷贝扩展方法 public static class DeepCopyExtension { public static T DeepCopy<T>(this T source) { if (source == null) return default; var json = System.Text.Json.JsonSerializer.Serialize(source); return System.Text.Json.JsonSerializer.Deserialize<T>(json); } }
赋值逻辑调整为:
Start = source.DeepCopy();
额外注意点
不要用无意义的Object类型声明你的业务实体,替换为对应的强类型实体类,既可以避免类型转换错误,也能让XAML绑定的智能提示正常工作。后续构造SQL更新语句时,直接用Start实例的属性值作为WHERE过滤条件,Current实例的属性值作为SET更新值即可符合你的业务需求。
内容的提问来源于stack exchange,提问作者Swyfte
相关产品推荐
相关产品推荐

