Silverlight DataContext:还在克隆对象中进行了更改

时间:2013-12-27 12:28:44

标签: c# asp.net .net silverlight

考虑复制/克隆对象的后续方法(将所有字段复制到新对象中)

    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(对象是我的datacontext)中更改了某些内容,那么我的_adjustedWorkCopy(没有对其执行任何操作)在我的代码隐藏中)也改变了。我对你聪明的问题是:为什么会发生这种情况,我该如何解决呢?我在这里缺少什么(可能是非常基本的东西)?

2 个答案:

答案 0 :(得分:1)

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

在Servicestack的示例中,您可以:

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

也许这会有所帮助。

答案 1 :(得分:0)

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

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)

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