常见/全局数据在mvvm中的位置?

时间:2011-02-25 18:10:24

标签: mvvm

我正试图绕过mvvm并提出一个测试应用程序,我认为这将给我一个良好的基础。假设我的应用程序每分钟都有一项服务,并在机场获取最新的航班到达和离开信息。现在假设我有3个不同的视图:InboundView,OutboundView和GateView。入境和出境视图只显示入境和出境航班的各种航班详情,我相信我们已经在机场的航班板上看到了这些航班。 GateView将显示类似的航班信息,但可能按门#而不是航班#。

进行排序

因此,Flight对象的模型将包含航班数据详细信息以及Gate对象的实例,该对象将在航班到达后进行适当更新。

所以所有3个视图都使用相同的飞行数据服务,我知道我可以将该服务的实例传递给每个VM但是我需要在每个视图模型上连接相应的INPC事件,这似乎不到理想的视图/ vms数量增加。

现在,每个VM使用一个ListCollectionView包裹传入的飞行数据集合,我只是根据入站/出站等进行排序/过滤。但我希望将服务结果合并到一个父视图中然后,我可以在父视图模型级别处理所有INPC等事件,并且如果数据上的数据,那么这些事件将自动传递给每个子视图。特定的航班变化(例如其门)而不是必须在每个VM中单独处理。

我已经查看了MVVM Light的Messenger框架,但似乎每个子VM都必须注册该消息并单独响应它。

这有意义吗?我在这里走在正确的轨道上吗?

1 个答案:

答案 0 :(得分:0)

  

所以所有3个视图都使用相同的飞行数据服务,我知道我可以将该服务的实例传递给每个VM但是我需要在每个视图模型上连接相应的INPC事件,这似乎不到理想的视图/ vms数量增加。

如果“服务”实现了INotifyPropertyChanged,则不一定要这样做。请记住,您可以绑定到属性中的属性,即:{Binding Path=FlightService.Gate}或其他可能有效的属性。 (尽管如此,很难知道你的要求。)

  

我已经查看了MVVM Light的Messenger框架,但似乎每个子VM都必须注册该消息并单独响应它。

是的,如果您想使用消息传递框架,则需要在每个ViewModel中处理它。或者,您可以使用某种形式的服务位置或构造函数注入来“拉入”航班服务。后者是我个人的偏好。

在每个VM中处理这个问题的好处是,每个VM可能希望以不同的方式处理事情(否则,为什么有多于1个?)。通过在IoC中提取服务的引用,无论如何都可以处理这个问题。