c# - 多个 View 模型之间状态共享的具体例子(WPF MVVM)

标签 c# wpf mvvm data-binding

我有一个包含许多对象的 WPF/Entity Framework (4.0) 项目。我想构建应用程序,以便我可以在 View 模型之间共享对象选择状态。

例如:我们有汽车、司机、乘客和 cargo 类。我们还有用于 CarList、DriverList 等的 UserControls 和用于 CarEditor、DriverEditor 等的编辑器窗口。此外,我们还有用于所有这些(CarListViewModel、DriverListViewModel、CargoEditorViewModel 等)的 View 模型。这一切构成了一个可停靠界面,用户可以在其中打开多个对象列表、编辑器和查看器。

我想要的是一个具体的代码示例,说明如何连接多个 View 模型,以便在 CarList 中选择一辆汽车会导致该汽车在 CarEditorView 中上线,但也会在上下文有效的任何其他 View 中被选中(例如 DriverByCarView- 或只是 DriverList,如果有过滤谓词的话)。

有很多基于这个问题的建议和讨论。似乎占主导地位的两种方法是:

  • 3018307 : 通过提及消息传递子系统来讨论状态共享
  • 1159035 : 通过使用封闭的 View 模型讨论状态共享

这些方法中的一种是否比另一种更好?

是否有人以书面或小型代码项目的形式提供了这两种方法中的一种/两种方法的具体示例?

我仍在学习 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/

相关文章:

c# - 在 WPF 中使用 MVVM 打开新窗口的推荐方法是什么

c# - 在 WPF 中取消设置/更改绑定(bind)

c# - 在构造函数中使用 'this' 关键字

c# - 在 C# 中,是否有开箱即用的方法来构建 3 向查找表?

c# - 在 Azure 中无需修改代码即可部署

c# - 使用 IDisposable 进行垃圾收集

c# - Wpf TextBlock 中的垂直文本

c# - 如何在 C# 中处理客户端-服务器应用程序中的数据库并发?

c# - WPF、MVVM、ICommand 和存储库

c# - 单击IconButton后如何打开ContextMenu?