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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:52:53