C# 努力理解MVVM体系结构

C# 努力理解MVVM体系结构,c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,我正在尝试学习MVVM和WPF,并且正在使用MVVM Light工具包。这是我没有完全理解的,可能是因为我的UI架构不正确 事实上,我想要完成的事情很简单。顺便说一下,这是一个实用程序。我想要一个作为“控制器”的窗口,也就是说它有一组按钮。每个按钮都应更改帧的内容。示例:一个按钮加载“屏幕”(或“视图”(如果愿意),允许用户配置“代理”,这是一个自定义对象。另一个按钮加载第一个“屏幕”中代理机构的用户列表。此“用户”视图也需要加载到同一帧中。事实上,到目前为止,包含所有按钮的窗口实际上只负责在框

我正在尝试学习MVVM和WPF,并且正在使用MVVM Light工具包。这是我没有完全理解的,可能是因为我的UI架构不正确

事实上,我想要完成的事情很简单。顺便说一下,这是一个实用程序。我想要一个作为“控制器”的窗口,也就是说它有一组按钮。每个按钮都应更改帧的内容。示例:一个按钮加载“屏幕”(或“视图”(如果愿意),允许用户配置“代理”,这是一个自定义对象。另一个按钮加载第一个“屏幕”中代理机构的用户列表。此“用户”视图也需要加载到同一帧中。事实上,到目前为止,包含所有按钮的窗口实际上只负责在框架中加载“屏幕”。应用程序的内容将在所有单独的“屏幕”内

我不理解的是1)如何让每个屏幕/视图相互了解,因为一个屏幕/视图依赖于另一个屏幕/视图。在MVVM中,ViewModel似乎什么都不知道。但就我而言,我需要传递信息(比如我的机构)

如果我能得到一些我需要调查的线索,那就太好了


谢谢

一些想法可能会将一些点联系起来:

  • 每个视图(“屏幕”)很可能有一个viewmodel
  • 每个viewmodel将包含其相应视图的所有逻辑
  • Viewmodels可以并将了解模型(机构、用户)
  • Viewmodels可以通过MVVM灯光下的Messenger相互通信
  • 将MVVMLight的Messenger视为“应用程序范围的事件系统”。当您从一个视图模型发送消息时,任何其他视图模型都可以侦听该消息/事件,并根据需要对其作出反应

这有帮助吗?继续你的想法,我会继续评论,我相信社区也会:)

他们不应该互相了解。这就是Messenger用于控制器和视图订阅他们感兴趣的事件的功能。这样一来,他们就不需要知道或关心事件的起源

嗯,肯德里克更快。他说了什么

另外,听起来您需要一个Outlook类型的界面,一些加载其他视图的导航。我刚才也有同样的问题

几件事:

  • 您的每个屏幕都应该是单独的视图(例如,用户控件或新窗口-我想您已经这样做了)
  • 您希望在应用程序中显示的模型的每个部分(例如代理、用户)都应该使用其专用的视图模型进行包装
  • 你的观点并不需要相互了解;您可以在视图模型上使用命令或事件来消除这些依赖关系
  • 视图模型只需要知道一件事:它所基于的模型
  • 最好将视图看作真正简单的类,只负责呈现内容;没有逻辑,没有代码(除非它纯粹与UI/显示相关)是可以遵循的
您可以尝试先准备模型(如果尚未准备好),然后为它们创建视图模型(考虑要向视图公开模型的哪些属性),一旦准备好,就基于视图模型构建视图。另一种方法也是可行的选择——选择你觉得更自然的


还有一件事:由于您提到可以在一个(我假设)主区域中显示多个屏幕,请考虑使用
booliscurrentlyactive
属性为视图模型配备一些东西。通过这种方式,您可以通过单击按钮轻松地显示/隐藏视图,并且仍然可以利用绑定机制。

要更好地理解MVVM模式,请参阅本文:


另外,我建议您看看框架。

这有很大帮助:)我想我现在理解了ViewModels之间的联系。我想,为了让主应用程序窗口能够在框架中切换视图,它需要一个变量,该变量由其ViewModel控制,并根据按下的按钮进行更新。如果我用那棵树弄错了,请纠正我。或者更好的是,将框架内容绑定到ViewModel中的一个属性。我想我已经了解了MVVM的要点。lolCaliburn只是另一个类似MVVM Light的工具包,对吗?我有兴趣学习我能学的所有较轻的:)是的,你说得对。Caliburn.Micro由一个~75k的组件组成,为WPF4、SL4和WP7构建。那里的轮廓很棒。我没有考虑过有一个“活跃”的属性。太好了,是的。有点像前景。事实上,这给了我一个很好的UI设计想法,哈哈。我现在正在看你的问题。谢谢;)我甚至可能有实现这一点的代码。我不确定我是否保留了它。我得看看,那太好了。当我昨晚玩这个游戏时,我发现自己在慢慢地使用旧的模式。当使用一个不熟悉的模式时,这肯定是思想上的转变。当然,我可能找不到它,或者发现我没有保存它。对于任何更大的应用程序,MVVM都更倾向于我们的演示。MVVM中的模型不一定表示表示表的模型。我们仍然有一个可以连接所有虚拟机的控制器。很难解释。MVVM的大多数演示都是琐碎的,不是真实的世界。很抱歉,我没有代码。这并不太复杂,与我的链接帖子中的答案差不多。