如何防止 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 ..

问题

例如,我打开了一个 good 进行编辑并更改了一些数据,但不保存它并取消编辑...这里更改数据返回到 GoodListViewModel !!!

为什么会发生这种情况...因为 ObservableCollection propertyChange 或 Messenger 实施?

请注意,您不会在此处生成 Good 实例的副本。您实际上做的是将您的原始实例发送到 GoodDetailViewModel。如果 GoodDetailViewModelGood 实例进行任何更改,GoodListViewModel 也会看到它们。

您必须 implement ICloneableGood class 以避免这种行为 - 然后您可以发送副本,编辑它,然后将其发回(前提是您不想放弃所有更改)。