如何防止 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
。如果 GoodDetailViewModel
对 Good
实例进行任何更改,GoodListViewModel
也会看到它们。
您必须 implement ICloneable
为 Good
class 以避免这种行为 - 然后您可以发送副本,编辑它,然后将其发回(前提是您不想放弃所有更改)。
我有一个好模型:
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
。如果 GoodDetailViewModel
对 Good
实例进行任何更改,GoodListViewModel
也会看到它们。
您必须 implement ICloneable
为 Good
class 以避免这种行为 - 然后您可以发送副本,编辑它,然后将其发回(前提是您不想放弃所有更改)。