Wpf MVVM视图模型中的逻辑在哪里处理?
在初步阅读了WPF和MVVM之后,我目前正在为数字IO控制器开发一个小型调试应用程序。在此应用程序中,我得到了一个视图模型树,如下所示: IOControllerViewModel>ConfigurationViewModels>PortViewModels>ChannelViewModels 这对应于业务对象,其中IOController包含一组配置,然后包含一个列表端口,然后包含一个通道列表,最后表示IO控制器的输入/输出通道 但现在我的问题是在哪里处理“逻辑” 例如,我想切换输出通道的状态。IOControllerViewModel是当前唯一包含所需的ToggleChannel()方法的引用业务对象的实例。现在我看到三种选择:Wpf MVVM视图模型中的逻辑在哪里处理?,wpf,mvvm,controller,logic,viewmodel,Wpf,Mvvm,Controller,Logic,Viewmodel,在初步阅读了WPF和MVVM之后,我目前正在为数字IO控制器开发一个小型调试应用程序。在此应用程序中,我得到了一个视图模型树,如下所示: IOControllerViewModel>ConfigurationViewModels>PortViewModels>ChannelViewModels 这对应于业务对象,其中IOController包含一组配置,然后包含一个列表端口,然后包含一个通道列表,最后表示IO控制器的输入/输出通道 但现在我的问题是在哪里处理“逻辑” 例如,我想切换输出通道的状态
非常感谢 如果我理解正确的话,您使用的是一个层次结构,它可以与一个视图模型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!一个轻量级的事件系统似乎正是我所需要的(除了一些基因)