【问题标题】:Struggling to understand MVVM architecture努力理解 MVVM 架构
【发布时间】:2011-12-30 17:05:15
【问题描述】:

我正在尝试学习 MVVM 和 WPF,并且我正在使用 MVVM Light Toolkit。以下是我不完全理解的内容,可能是由于我的 UI 架构不正确。

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

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

如果我能得到一些关于我需要研究什么的提示,那就太好了。

谢谢!

【问题讨论】:

    标签: c# wpf mvvm mvvm-light


    【解决方案1】:

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

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

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

    【讨论】:

    • 这很有帮助 :) 我想我现在理解了 ViewModel 之间的联系。我想为了让主应用程序窗口能够切换框架中的视图,它需要一个由其 ViewModel 控制并根据按下的按钮进行更新的变量。如果我用那棵树叫错了树,请纠正我。或者更好的是,将框架内容绑定到 ViewModel 中的一个属性。我想我得到了 MVVM 的要点 lol
    【解决方案2】:

    几件事:

    • 您的每个屏幕都应该是单独的视图(例如,用户控件或新窗口 - 我想您已经这样做了)
    • 您要在应用程序中显示的模型的每个部分(例如代理、用户)都应使用其专用的视图模型进行包装
    • 您的观点并不需要相互了解;您可以在视图模型上使用命令或事件来摆脱这些依赖关系
    • 视图模型只需要了解一件事:它所构建的模型
    • 最好将视图视为非常简单的类,只负责呈现内容;没有逻辑,没有后面的代码(除非它纯粹与 UI/显示相关)是要遵循的

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

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

    【讨论】:

    • 那里的大纲很棒。我没有考虑拥有一个“isactive”属性。很棒。
    【解决方案3】:

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

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

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

    【讨论】:

    • 是的。有点像 Outlook。事实上,这给了我一个很好的 UI 设计理念,哈哈。我现在正在看你的问题。谢谢;)
    • 我什至可能有代码可以做到这一点。我不确定我是否保留了它。我得看看。
    • 那太好了。昨晚在玩这个的时候,我发现自己慢慢地使用了旧模式。使用不熟悉的模式当然是思想上的转变:/
    • 当然不是我可能找不到它,或者发现我没有保存它。对于任何更大的应用程序,MVVM 对我们来说更倾向于展示方面。 MVVM 中的模型不一定意味着代表表格的模型。我们仍然有一个控制器可以连接所有的虚拟机,什么都没有。难以解释。 MVVM 的大多数演示都是微不足道的,并不真实。
    • 对不起,我没有代码。这并不太复杂,与我链接帖子中的答案差不多。
    【解决方案4】:

    要更好地理解 MVVM 模式,请查看这篇文章:WPF Apps With The Model-View-ViewModel Design Pattern

    另外我建议你看看Caliburn Micro 框架。

    【讨论】:

    • Caliburn 只是另一个类似 MVVM Light 的工具包,对吧?我有兴趣学习所有我能做到的轻量级的:)
    • 是的,你是对的。 Caliburn.Micro 包含一个为 WPF4、SL4 和 WP7 构建的约 75k 程序集。
    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多