簡體   English   中英

如何防止MVVM Light Messenger無法跟蹤注冊的對象

[英]How can I prevent MVVM Light Messenger to Not track Registered Object

我有一個好榜樣:

public class Good 
{
    public int GoodId { get; set; }
    public string Name { get; set; }
}

還有一個GoodListViewModel:

public class GoodListViewModel()
{
    // ...

    ObservableCollection<Good> goods;

    public Good SelectedGood
    {
        get { return selectedGood; }
        set
        {
            selectedGood = value;
            RaisePropertyChanged("SelectedGood");
        }
    }

    // ...

    //This will send selected Good to GoodDetailViewModel For Edit
    Messenger.Default.Send(SelectedGood, "GoodForEdit");

    // ...

}

還有一個GoodDetailViewModel:

public class GoodDetailViewModel
{
    public GoodDetailViewModel(IGoodService gs)
    {
        // ...
        Messenger.Default.Register<Good>(this,"GoodForEdit", instance);
    }

    public void instance(Good good)
    {
        good.Name = "ChangedName";
    }
}

我使用MVVM Light Messenger進行發送和接收以及ViewmodelLocator ..

問題

例如,我打開了一個用於編輯的商品並更改了一些數據,但是不保存並取消了編輯……這里更改的數據又回到了GoodListViewModel!

為什么發生這種情況……是由於ObservableCollection propertyChange或Messenger實現?

請注意,您不會在此處生成您的Good實例的副本。 您實際上要做的是將原始實例發送到GoodDetailViewModel 如果GoodDetailViewModelGood實例進行了任何更改,則GoodListViewModel也將看到它們。

您必須為Good實現ICloneable以避免這種行為-然后您可以發送副本,對其進行編輯,然后將其發送回(假設您不想放棄所有更改)。

暫無
暫無

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

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