【问题标题】:Silverlight DataContext: Changes also being made in Cloned ObjectSilverlight DataContext:克隆对象中也发生了变化
【发布时间】:2013-12-27 12:28:43
【问题描述】:

考虑以下复制/克隆对象的方法(所有字段都复制到新对象中)

    public AangepastWerk CloneAdjustedWork(AangepastWerk pAdjustedWork)
    {
        return new AangepastWerk()
        {
            AangepastWerkID = pAdjustedWork.AangepastWerkID,
            ArbeidsOngeval = pAdjustedWork.ArbeidsOngeval,
            DatumCreatie = pAdjustedWork.DatumCreatie,
            DatumLaatsteWijziging = pAdjustedWork.DatumLaatsteWijziging,
            DatumOngeval = pAdjustedWork.DatumOngeval,
            GewijzigdDoor = pAdjustedWork.GewijzigdDoor,
            NietErkend = pAdjustedWork.NietErkend,
            Stamnummer = pAdjustedWork.Stamnummer,
            Verzorging = pAdjustedWork.Verzorging,
            VerzorgingId = pAdjustedWork.VerzorgingId
        };
    }

我有一个表单,它打开一个子表单,其中传递了两个对象(上述类型的同一对象的 2 倍)。我这样打开表格:

                //my selected Record
                Record rec = DateGridAdjustedWorks.ActiveRecord; 
                AangepastWerk AWorkObject = (AangepastWerk)((DataRecord)rec).DataItem;
                AangepastWerk AWorkObjectBackup = _Vm.CloneAdjustedWork(AWorkObject);
                WindowModifyAdjustedWork windowForModify = new WindowModifyAdjustedWork(AWorkObject,AWorkObjectBackup, true);
                windowForModify.Closing += new CancelEventHandler(OnModifyAWClosing);
                windowForModify.ShowDialog();

在那个子窗体中,我将第一个对象设置为 DataContext。 _adjustedWork 和 _adjustedWorkCopy 是表单的属性

            _adjustedWork = pAdjustedWork;
            GridAdjustedWork.DataContext = AdjustedWork;
            _adjustedWorkCopy = pAdjustedWorkCopy;

问题: 在表单中,我能够在保留原始对象的同时更改对象。用户可以看到原始对象,因此他有可能跟踪更改(用户请求)但是如果我更改了我的 _adjustedWork(我的数据上下文的对象)然后我的 _adjustedWorkCopy (没有对其执行任何操作)在我的代码隐藏中)也被改变了。我问你们聪明的问题是:为什么会发生这种情况,我该如何解决?我在这里缺少什么(可能是一些非常基本的东西)?

【问题讨论】:

    标签: c# asp.net .net silverlight


    【解决方案1】:

    我总是通过序列化为 json 进行深度克隆。

    以 Servicestack 为例,您可以:

    var json = myObject.ToJson();
    var clonedObject = json.FromJson<MyObject>();
    return clonedObject;
    

    也许这会有所帮助。

    【讨论】:

    • ServiceStack (w JSON) 可以为我提供一个潜在的工作解决方案。但我希望避免使用第三方 DLL 的
    【解决方案2】:

    找到克隆对象也收到更改的原因

    public AangepastWerk CloneAdjustedWork(AangepastWerk pAdjustedWork)
    {
        return new AangepastWerk()
        {
            AangepastWerkID = pAdjustedWork.AangepastWerkID,
            ArbeidsOngeval = pAdjustedWork.ArbeidsOngeval,
            DatumCreatie = pAdjustedWork.DatumCreatie,
            DatumLaatsteWijziging = pAdjustedWork.DatumLaatsteWijziging,
            DatumOngeval = pAdjustedWork.DatumOngeval,
            GewijzigdDoor = pAdjustedWork.GewijzigdDoor,
            NietErkend = pAdjustedWork.NietErkend,
            Stamnummer = pAdjustedWork.Stamnummer,
            Verzorging = pAdjustedWork.Verzorging, <------------ Issue lies here
            VerzorgingId = pAdjustedWork.VerzorgingId
        };
    }
    

    pAdjustedWork.Verzorging 在这种情况下是一个对象。我还需要克隆这个对象。我假设(错误地)如上所述的克隆会创建一个新的单独的“VerzorgingsObject”。

    我的问题的解决方法是:

            MedicalCare_VM mcare_VM = new MedicalCare_VM();
            return new AangepastWerk()
            {
                AangepastWerkID = pAdjustedWork.AangepastWerkID,
                ArbeidsOngeval = pAdjustedWork.ArbeidsOngeval,
                DatumCreatie = pAdjustedWork.DatumCreatie,
                DatumLaatsteWijziging = pAdjustedWork.DatumLaatsteWijziging,
                DatumOngeval = pAdjustedWork.DatumOngeval,
                GewijzigdDoor = pAdjustedWork.GewijzigdDoor,
                NietErkend = pAdjustedWork.NietErkend,
                Stamnummer = pAdjustedWork.Stamnummer,
                Verzorging = mcare_VM.CloneMedicalCare(pAdjustedWork.Verzorging), 
                VerzorgingId = pAdjustedWork.VerzorgingId
            };
    

    克隆:

             Verzorging = mcare_VM.CloneMedicalCare(pAdjustedWork.Verzorging)
    

    使用与前面提到的相同的逻辑(复制每个字段)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 2013-09-06
      • 2020-02-23
      • 2021-04-02
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多