苦苦于了解MVVM架构

时间:2011-11-16 18:43:29

标签: c# wpf mvvm mvvm-light

我正在尝试学习MVVM和WPF,而我正在使用MVVM Light Toolkit。这是我不完全理解的,也许是由于我的UI架构不正确。

我想要实现的目标实际上非常简单。顺便说一下,这是一个实用的应用程序。我想要一个充当“控制器”的窗口,以便说它有一组按钮。每个按钮都应该改变框架的内容。示例:一个按钮加载“屏幕”(或“视图”,如果您愿意),允许用户配置作为自定义对象的“代理”。另一个按钮加载来自代理商的第一个“屏幕”中的用户列表。此“用户”视图也需要加载到同一帧中。事实上,截至目前,具有所有按钮的窗口实际上只负责加载框架中的“屏幕”。应用程序的内容将在所有单独的“屏幕”中

我不理解的是1)如何让每个屏幕/视图彼此了解,因为一个依赖于另一个。似乎在MVVM中,ViewModel不应该知道任何事情。但就我而言,我需要传递信息(例如我的代理商)。

如果我能得到一些我需要研究的提示,那就太棒了。

谢谢!

4 个答案:

答案 0 :(得分:13)

可能会连接某些点的一些想法:

  • 每个视图(“屏幕”)最有可能有一个视图模型。
  • 每个viewmodel将包含其相应视图的所有逻辑
  • Viewmodels可以并且将会了解模型(代理商,用户)
  • Viewmodels可以通过MVVM Light中的Messenger进行相互通信
  • 将MVVM Light的Messenger视为“应用程序范围的事件系统”。当您从一个视图模型发送消息时,任何其他视图模型都可以侦听该消息/事件并根据需要对其做出反应。

这有帮助吗?保持你的想法,我将继续评论,我相信社区也将如此:)

答案 1 :(得分:4)

少数事情:

  • 你的每个屏幕应该是单独的视图(例如用户控制或新窗口 - 我想你已经这样做了)
  • 您希望在应用程序中显示的模型的每个部分(例如,代理商,用户)都应该使用其专用视图模型进行包装
  • 你的观点并不需要彼此了解;您可以在视图模型上使用命令或事件来摆脱这些依赖关系
  • 查看模型只需知道一个的事情:建立在
  • 上的模型
  • 将视图视为非常简单的类是很好的,只有一个渲染内容的责任;没有逻辑,没有代码(除非它纯粹是UI /显示相关)是要遵循的东西

您可以先尝试准备模型(如果您还没有这样做),然后为它们制作视图模型(考虑要向视图公开的模型的属性),一旦准备就绪,建立您的视图基础在视图模型上。其他方式也是可行的选择 - 选择对你来说更自然的选择。

还有一件事:既然你提到你可以在一个(我假设)主区域中显示几个屏幕,那么考虑为你的视图模型配备bool IsCurrentlyActive属性的东西。这样,您可以通过按钮点击轻松显示/隐藏视图,并仍然使用绑定机制。

答案 2 :(得分:2)

他们不应该彼此了解。这就是Messenger用于控制器和视图订阅他们感兴趣的事件。这样他们就不需要知道或关心他们发生事件的位置。

嗯肯德里克更快。他说的话。

听起来你有点想要一个Outlook类型的界面,一些导航可以加载其他视图。我刚才有同样的问题。 How to do Regions in WPF without Prism?

答案 3 :(得分:1)

为了更好地理解MVVM模式,请参阅本文:WPF Apps With The Model-View-ViewModel Design Pattern

另外,我建议您查看Caliburn Micro框架。