在视图模型之间更新 ObservableCollection
Update ObservableCollection between Viewmodels
我在两个 ViewModel 之间共享了一个 observableCollection。当我启动 viewmodel 时,两个 ViewModel 中的 observablecollections 都工作正常,但是当我在源 ObservableCollection 中进行更改时,它不会在第二个 ViewModel 的 ObservableCollection 中更新它。我怎样才能使第二个 observalbeCollection 接收第一个 ObservableCollection 中所做的更改。
虚拟机 1
public Class VM1
{
private ObservableCollection<CameraPackage> _cameraPackagesPerScene = new ObservableCollection<CameraPackage>();
public ObservableCollection<CameraPackage> CameraPackagesPerScene
{
get { return _cameraPackagesPerScene; }
set { _cameraPackagesPerScene = value; RaisePropertyChanged(); }
}
}
VM2
public Class VM2
{
public ObservableCollection<CameraPackage> CameraPackagesPerSceneAndPartials { get; set; }
public VM2 (VM1 vm1)
{
CameraPackagesPerSceneAndPartials = new ObservableCollection<CameraPackage>(vm1.CameraPackagesPerScene);
}
}
您不应基于其他 OC 创建新的 ObservableCollection。只需将一个实例共享给两个 ViewModel:
public VM2 (VM1 vm1)
{
CameraPackagesPerSceneAndPartials = vm1.CameraPackagesPerScene;
}
或者仅将集合注入第二个 ViewModel:
public VM2 (ObservableCollection<CameraPackage> cameraPackagesPerSceneAndPartials)
{
CameraPackagesPerSceneAndPartials = cameraPackagesPerSceneAndPartials;
}
减少耦合的其他方法是使用EventAggregator or other event-based patterns。
您可以使用 mvvmlight messenger 交换来自视图模型的消息。
这是执行此操作的好方法。请参阅下面的示例:
发送中:
// Sends a notification message with a Person as content.
var person = new Person { FirstName = "Marco", LastName = "Minerva" };
Messenger.Default.Send(new NotificationMessage<Person>(person, "Select"));
正在接收:
// Registers for incoming Notification messages.
Messenger.Default.Register<NotificationMessage<Person>>(this, (message) =>
{
// Gets the Person object.
var person = message.Content;
// Checks the associated action.
switch (message.Notification)
{
case "Select":
break;
case "Delete":
break;
default:
break;
}
});
来自教程:
我在两个 ViewModel 之间共享了一个 observableCollection。当我启动 viewmodel 时,两个 ViewModel 中的 observablecollections 都工作正常,但是当我在源 ObservableCollection 中进行更改时,它不会在第二个 ViewModel 的 ObservableCollection 中更新它。我怎样才能使第二个 observalbeCollection 接收第一个 ObservableCollection 中所做的更改。
虚拟机 1
public Class VM1
{
private ObservableCollection<CameraPackage> _cameraPackagesPerScene = new ObservableCollection<CameraPackage>();
public ObservableCollection<CameraPackage> CameraPackagesPerScene
{
get { return _cameraPackagesPerScene; }
set { _cameraPackagesPerScene = value; RaisePropertyChanged(); }
}
}
VM2
public Class VM2
{
public ObservableCollection<CameraPackage> CameraPackagesPerSceneAndPartials { get; set; }
public VM2 (VM1 vm1)
{
CameraPackagesPerSceneAndPartials = new ObservableCollection<CameraPackage>(vm1.CameraPackagesPerScene);
}
}
您不应基于其他 OC 创建新的 ObservableCollection。只需将一个实例共享给两个 ViewModel:
public VM2 (VM1 vm1)
{
CameraPackagesPerSceneAndPartials = vm1.CameraPackagesPerScene;
}
或者仅将集合注入第二个 ViewModel:
public VM2 (ObservableCollection<CameraPackage> cameraPackagesPerSceneAndPartials)
{
CameraPackagesPerSceneAndPartials = cameraPackagesPerSceneAndPartials;
}
减少耦合的其他方法是使用EventAggregator or other event-based patterns。
您可以使用 mvvmlight messenger 交换来自视图模型的消息。
这是执行此操作的好方法。请参阅下面的示例:
发送中:
// Sends a notification message with a Person as content.
var person = new Person { FirstName = "Marco", LastName = "Minerva" };
Messenger.Default.Send(new NotificationMessage<Person>(person, "Select"));
正在接收:
// Registers for incoming Notification messages.
Messenger.Default.Register<NotificationMessage<Person>>(this, (message) =>
{
// Gets the Person object.
var person = message.Content;
// Checks the associated action.
switch (message.Notification)
{
case "Select":
break;
case "Delete":
break;
default:
break;
}
});
来自教程: