在MVVM视图模型中处理逻辑的位置?

时间:2011-11-25 16:21:43

标签: wpf mvvm controller logic viewmodel

在对WPF和MVVM进行一些初步阅读后,我正在为数字IO控制器开发一个小型调试应用程序。在这个应用程序中,我有一个视图模型,看起来像这样:

IOControllerViewModel> ConfigurationViewModels> PortViewModels> ChannelViewModels

这对应于业务对象,其中IOController包含一组配置,其中包含一个列表Ports,其中包含一个Channel列表,最终表示IO控制器的输入/输出通道。

但现在我的问题是在哪里处理“逻辑”?

例如,我想切换输出通道的状态。 IOControllerViewModel是当前唯一的实例,它具有对业务对象的引用,包含所需的ToggleChannel()方法。现在我看到三个选项:

  1. 将登录信息放在ChannelViewModel中。因此通过了 从我的根一直到叶子的必要的业务对象。

  2. 将逻辑放在IOControllerViewModel中。因此,事件或 类似的东西必须由ChannelViewModel触发然后 由IOControllerViewModel处理。

  3. 介绍一个控制器,负责任何逻辑和 将控制器发布到所有视图模型。

  4. 还有其他选择吗?最佳做法?

  5. 非常感谢!

2 个答案:

答案 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。

我希望我帮到你。