在对WPF和MVVM进行一些初步阅读后,我正在为数字IO控制器开发一个小型调试应用程序。在这个应用程序中,我有一个视图模型,看起来像这样:
IOControllerViewModel> ConfigurationViewModels> PortViewModels> ChannelViewModels
这对应于业务对象,其中IOController包含一组配置,其中包含一个列表Ports,其中包含一个Channel列表,最终表示IO控制器的输入/输出通道。
但现在我的问题是在哪里处理“逻辑”?
例如,我想切换输出通道的状态。 IOControllerViewModel是当前唯一的实例,它具有对业务对象的引用,包含所需的ToggleChannel()方法。现在我看到三个选项:
将登录信息放在ChannelViewModel中。因此通过了 从我的根一直到叶子的必要的业务对象。
将逻辑放在IOControllerViewModel中。因此,事件或 类似的东西必须由ChannelViewModel触发然后 由IOControllerViewModel处理。
介绍一个控制器,负责任何逻辑和 将控制器发布到所有视图模型。
还有其他选择吗?最佳做法?
非常感谢!
答案 0 :(得分:3)
通常我将逻辑放在使用它的层上,并使用PRISM的EventAggregator
或MVVM Light Messenger
之类的消息传递系统在ViewModel之间进行通信。 (如果你有兴趣,我写了一篇关于这个here)
在您的情况下,它取决于哪个图层处理登录。例如,如果LoginViewModel成功验证用户,它将广播类似UserAuthenticated
消息的内容,其中包含相关参数。感兴趣的ViewModel然后可以订阅UserAuthenticated
消息,并相应地处理它们。
请记住,使用MVVM,您的ViewModel就是您的应用程序。应用程序应该运行得很好,没有任何视图(例如来自测试脚本)
答案 1 :(得分:2)
如果我理解正确的话,你会使用一个只能与一个ViewModel一起使用的层次结构,IOControllerViewModel。所有这些配置,端口和通道都可以是可观察的属性或其相应项的集合。
然后,您只需使用包含ItemsControl的IOControllerView,它可以访问所有配置。在每个配置项的DataTemplate中,您将拥有一个ItemsControl,它将端口用作ItemsSource,依此类推。
拥有比所需更多的ViewModel并不好,特别是如果不需要View,因为您可以使用DataTemplate。
我希望我帮到你。