我对 MVVM 模式有一些疑问

2024-05-12

我叫 Jesús,来自西班牙,是一名 .NET 开发人员,几天前我刚刚发现了这个伟大的网络。

我有一些关于 MVVM 模式的问题,如果您能回答我,我将很高兴。
我三个月前开始使用 WPF,并且学习了 MVP 模式。
MVP 非常好,因为您可以很好地构建应用程序。

我开始到处都看到 MVVM,但每个人都按照自己的方法使用该模式。
每个博主都在其 WPF 博客中谈论 MVVM,但每个实现都是不同的。

我现在专注于在 CodePlex 上使用 MVVM 工具包的实现,但我有疑问并且找不到太多信息。

我认为 MVVM 是 MVP 的变体。
对于 MVP,每个视图都有一个演示者来完成视图的工作。
在 MVVM 中也是一样的,但是只要有可能就使用命令。

我还发现,如果你需要一个活动,就像 MVP 一样;将事件委托给演示者/视图模型,也就是说,如果它不是视图的工作(例如更新 UI)。

另一方面,视图模型没有视图引用,因此我必须更加努力地处理数据绑定。
您必须使用 DelegateCommands(与 RelayCommands 相同,对吧?)。

嗯...更多问题...使用具有两个视图/用户控件的相同视图模型是否安全?

哦...昨天玩MVVM的时候遇到了一个问题。
我创建了一个CommandReference我的键绑定命令的命令,我将此引用分配给我的按钮的命令属性,嗯,CanExecuted第一次可以用,但是没有更新IsEnabled财产时CanExecuted是真的。我通过将命令直接绑定到按钮而不使用引用来修复它。问题是:为什么有些代码将引用链接到对象,而为什么其他代码直接绑定命令?

我应该学习哪些与 MVVM 相关的知识? (我昨天看到了一种叫做执着行为的东西,但我不知道那是什么)。

我正在重写一个使用 MVP 开发的笔记应用程序,但现在使用 MVVM。我将用命令替换事件(使用 DelegateCommand),消除视图模型上的视图引用,我认为这都是因为我看到的 MVVM 示例很像 MVP。

好吧,如果您指出我对这种模式的所有误解,我将不胜感激。

谢谢你,将来我会帮助下一个 MVVM 新手:)


哇,我将尝试尽可能多地回答您的问题,这些问题不涉及特定的技术或框架...如果我错过了一些问题,我很抱歉(要点会有所帮助)

  • MVVM is not necessarily a variation of MVP. MVP itself is an ambiguous, loaded term. Martin Fowler did it justice by splitting it into two patterns http://www.martinfowler.com/eaaDev/ModelViewPresenter.html. MVVM stands on its own, but shares some concepts with the MVP patterns. Like all UI patterns, it seeks to separate view logic from business logic as much as possible. What the MVVM does that is different from MVP is it creates a model purely for the purpose of presentation (or a presentation model http://www.martinfowler.com/eaaDev/PresentationModel.html). This is different than how MVP patterns solve the separation problem.
    • 被动观点 http://www.martinfowler.com/eaaDev/PassiveScreen.html- 使用被动视图,视图永远看不到模型。
    • 监督控制员 http://www.martinfowler.com/eaaDev/SupervisingPresenter.html- MVVM 更接近监督控制器模式,而不是被动视图。这里唯一真正的区别可能是 MVVM 显式地为视图创建一个模型(因此称为“视图模型”)
  • ViewModel 没有对视图的引用,因为它充当视图数据的模型。这是一个适当的抽象。如果它也引用了视图,那么您将具有双向依赖关系,这会产生额外的耦合。此外,ViewModel 本身没有真正的理由来了解视图。它唯一的工作就是从视图中抽象出模型(实际的业务模型)。
  • DelegateCommands 与 RelayCommands - 我相信您在这里获得了特定的技术,所以我无法很好地回答这个问题。
  • 您不应为多个视图设计一个 ViewModel。这只会造成复杂性,因为如果您更改视图,您将必须调查哪些 ViewModel 可能受到影响并更改它们。这可能会导致级联效应。您的行为应该在业务模型中,而不是 ViewModel 中,因此 ViewModel 只需包含转换和事件处理逻辑。
  • 然而,ViewModel 与 UserControl 的比例为 1:1 是个好主意,因为 UserControls 应该能够充当屏幕上的自治单元。
  • 至于其他技术具体问题,抱歉,我没有答案。不过,我建议您仔细阅读我包含的链接被动观点 http://www.martinfowler.com/eaaDev/PassiveScreen.html, 监督控制员 http://www.martinfowler.com/eaaDev/SupervisingPresenter.html, and 演示模型 http://www.martinfowler.com/eaaDev/PresentationModel.html。它们为 UI 模式提供了一些上下文,并且是技术中立的。

重要的是要记住,虽然 MVVM 适合解决采用 WPF 带来的问题,但它不是特定于技术的模式。如果你太深入地研究特定的实现而不理解底层的原理,你可能会在早期犯下一些非常大的错误,等到发现它们时就为时已晚了。不幸的是,MVVM 并不是一个有据可查的模式,当你说每个人对它是什么都有自己的想法时,你是对的。

这不是一个革命性的模式(它已经以不同的名称存在了很多年),但 WPF 的数据绑定使其成为现在可行的解决方案,因此它正在享受新的流行。它是good模式,但它不是教义。以适当的怀疑态度对待你所面临的每一个“命令”。

EDIT

@micahtan https://stackoverflow.com/users/107290/micahtan数据绑定是 WPF 中非常重要的部分,这一点是正确的。我说过,WPF 的数据绑定支持 MVVM 解决方案,但绑定本身非常强大,这就是为什么 MVVM 的采用增长速度快于相关文献的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我对 MVVM 模式有一些疑问 的相关文章

  • DispatcherTimer 未按时执行

    我正在使用 c 中的 DispatchTimer 编写一个时钟应用程序 但由于某些原因 我的时钟似乎时不时地跳过 1 秒 例如 52 秒 gt 54 秒 跳过 53 秒 在我看来 计时器并不是每秒都执行一次 DispatcherTimer
  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • SetWindowsHookEx 函数返回 NULL

    我正在研究 DLL 注入 但收到错误如下 挂接进程失败 87 参数不正确 目标进程和dll都是64位的 注入代码为 BOOL HookInjection TCHAR target TCHAR dll name https msdn micr
  • 没有 Unicode 字节顺序标记。无法切换到 Unicode

    我正在使用 XSD 编写 XML 验证器 下面是我所做的 但是当验证器到达该线时while list Read 它给了我错误 没有 Unicode 字节顺序标记 无法切换到 Unicode 有人可以帮我解决吗 public class Va
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 将 C# 反射代码移植到 Metro-Ui

    我正在尝试移植使用反射的现有 C 类 通用工厂 但我无法编译这段代码 Type types Assembly GetAssembly typeof TProduct GetTypes foreach Type type in types i
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 在“using”语句中使用各种类型 (C#)

    自从C usingstatements只是try finally dispose 的语法糖 为什么它接受多个对象仅当它们属于同一类型时 我不明白 因为它们需要的只是 IDisposable 如果它们都实现 IDisposable 应该没问题
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • 程序退出后,TcpListener Socket 仍处于活动状态

    当我的程序退出时 我试图停止 TCP 侦听器 我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码本质上是 try myServer Server Shutdown SocketShutdown Both catch E
  • 在何处将 CFLAG(例如 -std=gnu99)添加到 (Eclipse CDT) 自动工具项目中

    我有一个简单的 Autotools C 项目 不是 C 其框架是由 Eclipse CDT Juno 为我创建的 CFLAG 通过检查 似乎是 g O2 我希望所有生成的 make 文件也具有 std gnu99附加到 CFLAG 因为我使
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D

随机推荐