簡體   English   中英

Silverlight DataContext:也在克隆對象中進行了更改

[英]Silverlight DataContext: Changes also being made in Cloned Object

考慮以下復制/克隆對象的方法(將所有字段都復制到新對象中)

    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中進行了更改(沒有對其執行任何操作),則他可以跟蹤更改(用戶的請求)在我后面的代碼中)也進行了更改。 我向您開放的想法是:為什么會發生這種情況,我該如何解決? 我在這里缺少什么(可能是非常基本的東西)?

我總是將序列化為json進行深度克隆。

以Servicestack為例,您可以:

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

也許可以幫上忙。

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

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)

使用與前面提到的相同的邏輯(復制每個字段)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM