Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf MVVM视图模型中的逻辑在哪里处理?_Wpf_Mvvm_Controller_Logic_Viewmodel - Fatal编程技术网

Wpf MVVM视图模型中的逻辑在哪里处理?

Wpf MVVM视图模型中的逻辑在哪里处理?,wpf,mvvm,controller,logic,viewmodel,Wpf,Mvvm,Controller,Logic,Viewmodel,在初步阅读了WPF和MVVM之后,我目前正在为数字IO控制器开发一个小型调试应用程序。在此应用程序中,我得到了一个视图模型树,如下所示: IOControllerViewModel>ConfigurationViewModels>PortViewModels>ChannelViewModels 这对应于业务对象,其中IOController包含一组配置,然后包含一个列表端口,然后包含一个通道列表,最后表示IO控制器的输入/输出通道 但现在我的问题是在哪里处理“逻辑” 例如,我想切换输出通道的状态

在初步阅读了WPF和MVVM之后,我目前正在为数字IO控制器开发一个小型调试应用程序。在此应用程序中,我得到了一个视图模型树,如下所示:

IOControllerViewModel>ConfigurationViewModels>PortViewModels>ChannelViewModels

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

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

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

  • 将登录名放在ChannelViewModel中。就这样通过了 必要的业务对象从我的根一直到叶子

  • 将逻辑放入IOControllerViewModel中。因此一个事件或事件 ChannelViewModel必须触发类似的命令,然后 由IOControllerViewModel处理

  • 引入一个控制器,负责任何逻辑和 将控制器发布到所有视图模型

  • 还有其他选择吗?最佳实践


  • 非常感谢

    如果我理解正确的话,您使用的是一个层次结构,它可以与一个视图模型IOControllerViewModel共存。所有这些配置、端口和通道都可以是其相应项的可观察属性或集合

    然后,您只需使用一个IOControllerView,其中包含一个ItemsControl,它可以访问所有配置。在每个配置项的DataTemplate中,都会有一个ItemsControl,它将端口用作ItemsSource等

    拥有比需要更多的视图模型是不好的,特别是如果不需要视图,因为可以使用DataTemplate


    希望我没弄错。

    如果我理解正确,您使用的是一种层次结构,它可以与一个ViewModel(IOControllerViewModel)共存。所有这些配置、端口和通道都可以是其相应项的可观察属性或集合

    然后,您只需使用一个IOControllerView,其中包含一个ItemsControl,它可以访问所有配置。在每个配置项的DataTemplate中,都会有一个ItemsControl,它将端口用作ItemsSource等

    拥有比需要更多的视图模型是不好的,特别是如果不需要视图,因为可以使用DataTemplate


    我希望我没有弄错。

    通常我会在使用它的层上添加逻辑,并使用消息传递系统,如PRISM的
    事件聚合器
    或MVVM Light的
    信使
    在ViewModels之间进行通信。(如果你感兴趣,我写了一篇简短的帖子)

    在您的情况下,这取决于哪个层处理登录。例如,如果LoginViewModel成功地对用户进行身份验证,它将广播类似于
    UserAuthenticated
    消息的内容,其中包含相关参数。感兴趣的ViewModels可以订阅
    UserAuthenticated
    消息,并相应地处理它们


    请记住,使用MVVM,您的ViewModels就是您的应用程序。该应用程序应该在没有任何视图的情况下运行良好(例如从测试脚本中)

    通常我会在使用它的层上放置逻辑,并使用消息传递系统,如PRISM的
    EventAggregator
    或MVVM Light的
    Messenger
    在ViewModels之间进行通信。(如果你感兴趣,我写了一篇简短的帖子)

    在您的情况下,这取决于哪个层处理登录。例如,如果LoginViewModel成功地对用户进行身份验证,它将广播类似于
    UserAuthenticated
    消息的内容,其中包含相关参数。感兴趣的ViewModels可以订阅
    UserAuthenticated
    消息,并相应地处理它们


    请记住,使用MVVM,您的ViewModels就是您的应用程序。应用程序在没有任何视图的情况下(例如从测试脚本中)应该可以正常运行。

    ToggleChannel()methid的作用是什么?它需要哪些业务对象?在(1选项)的情况下,您需要传递哪些业务对象?该方法读取通道的状态,反转该值,然后将新状态写回。唯一需要的业务对象是IOController,它被包装在IOControllerViewModel中。事实上,层次结构中的其他“业务对象”(配置、端口、通道)根本不包括任何逻辑。因此,将它们包装到ViewModel中是没有意义的。。。似乎我必须在这方面审查我(公司)的整个架构……ToggleChannel()methid做什么?它需要哪些业务对象?在(1选项)的情况下,您需要传递哪些业务对象?该方法读取通道的状态,反转该值,然后将新状态写回。唯一需要的业务对象是IOController,它被包装在IOControllerViewModel中。事实上,层次结构中的其他“业务对象”(配置、端口、通道)根本不包括任何逻辑。因此,将它们包装到ViewModel中是没有意义的。。。似乎我必须在这方面审查我(公司)的整个架构……耶,我也意识到我可能有太多的ViewModel(上面的评论)。整个“设计”需要一点回顾,我需要更多的MVVM技能:)耶,我也意识到我可能有太多的ViewModel(上面的评论)。整个“设计”需要一点回顾,我需要更多的MVVM技能:)谢谢Rachel!一个轻量级的事件系统似乎正是我所需要的(除了一些一般的架构审查;))谢谢Rachel!一个轻量级的事件系统似乎正是我所需要的(除了一些基因)