我有一个包含许多对象的 WPF/Entity Framework (4.0) 项目。我想构建应用程序,以便我可以在 View 模型之间共享对象选择状态。
例如:我们有汽车、司机、乘客和 cargo 类。我们还有用于 CarList、DriverList 等的 UserControls 和用于 CarEditor、DriverEditor 等的编辑器窗口。此外,我们还有用于所有这些(CarListViewModel、DriverListViewModel、CargoEditorViewModel 等)的 View 模型。这一切构成了一个可停靠界面,用户可以在其中打开多个对象列表、编辑器和查看器。
我想要的是一个具体的代码示例,说明如何连接多个 View 模型,以便在 CarList 中选择一辆汽车会导致该汽车在 CarEditorView 中上线,但也会在上下文有效的任何其他 View 中被选中(例如 DriverByCarView- 或只是 DriverList,如果有过滤谓词的话)。
有很多基于这个问题的建议和讨论。似乎占主导地位的两种方法是:
这些方法中的一种是否比另一种更好?
是否有人以书面或小型代码项目的形式提供了这两种方法中的一种/两种方法的具体示例?
我仍在学习 WPF,因此非常感谢指向阅读 API 基础知识的入口点的指针,但查看代码示例是我通常去的地方。
谢谢
如果有人感兴趣,这里有一些其他类似的讨论:
- 3816961 : 讨论根据对象类型(即遵循特定接口(interface)的任意类型的集合)返回多个 View 模型
- 1928130 : 讨论将 View 模型聚合为其他 View 模型的属性是否是个好主意(例如,由面板 View 模型组成的主窗口 View 模型)
- 1120061 : 本质上讨论了是使用 viewmodel-per-model 策略还是 viewmodel-per-view-element 策略。
- 4244222 : 讨论在使用嵌套对象层次结构时是否嵌套 View 模型。
- 4429708 : 直接讨论在 View 模型之间共享集合,但不详细讨论。
- List item : 讨论在单个 View 模型中管理多个选择。
最佳答案
实现此目的的典型方法是使用信使发布详细说明所选汽车的 CarSelected 消息。零个或多个 ViewModel 可以订阅 CarSelected 消息。对当前所选汽车感兴趣的 ViewModel 可以监听消息,然后采取相应行动。
Messenger 方法提供了一种干净的解耦设计,其中发布者和订阅者彼此没有依赖关系,因此可以轻松地独立发展 - 他们只需要知道汽车消息。 Messengers 是中介者模式的一种实现。
在 Prism 中,信使是 EventAggregator
,用于发布和订阅消息。
更新
除了 EventAggregator
带来的架构优势外,它还实现了弱事件,以防止未明确取消订阅的订阅者出现内存泄漏问题。
请参阅以下 EventAggregator 文档:
http://msdn.microsoft.com/en-us/library/ff649187.aspx
棱镜:
http://compositewpf.codeplex.com/
棱镜示例
public class ViewModel1
{
private readonly IEventAggregator _eventService;
private Car _selectedCar;
public ViewModel1(IEventAggregator eventService)
{
_eventService = eventService;
}
//Databound property...
public Car SelectedCar
{
set
{
_selectedCar = value;
var msg = new CarSelectedMessage { Car = _selectedCar };
_eventService.GetEvent<CarSelectedEvent>().Publish(msg);
}
}
}
public class ViewModel2
{
public ViewModel2(IEventAggregator eventService)
{
eventService.GetEvent<CarSelectedEvent>().Subscribe(msg =>
{
//DoStuff with msg...
});
}
}
public class Car {}
public class CarMessage
{
public Car Car { get; set; }
}
public class CarSelectedEvent : CompositePresentationEvent<CarMessage> {}
关于c# - 多个 View 模型之间状态共享的具体例子(WPF MVVM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4599802/