mvvm - mvvm 中的公共(public)/全局数据在哪里?

标签 mvvm

我试图了解 mvvm 并想出了一个测试应用程序,我认为它会给我一个很好的基础。假设我的应用程序有一个服务,它每分钟发出一次,并在机场获取最新的航类到达和离开信息。现在假设我有 3 个不同的 View :InboundView、OutboundView 和 GateView。入境和出境 View 将简单地显示入境和出境航类的各种航类详细信息,我相信我们都在机场的飞行板上看到过。 GateView 将显示类似的航类信息,但可能按登机口编号而不是航类编号排序。

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

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

现在,每个虚拟机都使用一个 ListCollectionView 包裹传入的飞行数据集合,我只是根据入站/出站等进行排序/过滤。但我希望将服务结果合并到一种父 View 模型中然后将对自身的引用传递给 subview ,然后我可以在父 View 模型级别处理所有 INPC 等事件,如果特定航类的数据发生变化,这些事件将自动渗透到每个 subview (例如它的门),而不必在每个 VM 中单独处理。

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

那有意义吗?我在正确的轨道上吗?

最佳答案

So all 3 views are using the same flight data service and I know I can pass an instance of that service to each VM but then I'd need to hook up the appropriate INPC events at each view model and that seems less than ideal as the number of views/vms increases.



如果“服务”实现了 INotifyPropertyChanged,则不必这样做。请记住,您可以绑定(bind)到属性中的属性,即:{Binding Path=FlightService.Gate}或其他任何可能有效的方法。 (不过,在这里很难知道您的要求。)

I've looked into the Messenger framework for MVVM Light but it still seems like each of the sub-VMs would have to register for the message and respond to it individually.



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

在每个 VM 中处理此问题的优点是每个 VM 可能希望以不同方式处理事物(否则,为什么会有超过 1 个?)。通过通过 IoC 提取对服务的引用,您可以根据需要处理此问题。

关于mvvm - mvvm 中的公共(public)/全局数据在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5120947/

相关文章:

c# - 在 MVVM 中,每个 ViewModel 是否只耦合到一个 Model?

c# - 如何对具有多个子层的根 ViewModel 进行单元测试?

c# - 了解 MEF System.Lazy<T,TMetaData>

c# - 为什么ComboBox在WPF MVVM中保留不同的值?

mvvm - 天数计算方法(使用 ZK 和 MVVM)

wpf - Powerbuilder .net、MVVM 和单元测试

wpf - 从上下文菜单的菜单项中检索所选项目。我正在使用 WPF、MVVM

c# - TextBox没有BorderStyle属性

wpf - 对话wpf的MVVM定位

c# - xamarin.forms-页面底部的“滑动”信息框