View 中对 ViewModel(即其 DataContext)的引用是否对 MVVM 模式有害?

2024-02-24

让我们说一个ViewModel发布一个Event and a View它正在使用该虚拟机作为其DataContext订阅该Event通过强制转换来获取对 VM 的引用DataContext到虚拟机实例:

vm = DataContext as MainViewModel;
if (vm == null) return;
vm.SomeUIRelatedNotice += DoSomethingUIRelated;

在我看来,VM ramins 是解耦的,它的可测试性不会受到任何影响,并且视图已经有对 VM 的引用,所以我认为这根本没有问题,但我想听听 MVVM 纯粹主义者是否认为这是一个糟糕的设计,会对 MVVM 模式产生负面影响,如果是的话,为什么?


只要视图模型本身不执行任何视图逻辑,我就不认为这会破坏 MVVM 模式。

在你的例子中,视图模型试图以某种方式交互和引导视图,所以你可能应该知道还有其他方法可以实现这种行为,这些方法被认为是更纯粹的 MVVM:

  • MVVM Light 工具包Messenger service http://msdn.microsoft.com/en-us/magazine/jj694937.aspx
  • Prism's EventAggregator http://msdn.microsoft.com/en-us/library/ff921122.aspx or its 交互模式 http://msdn.microsoft.com/en-us/library/gg405494%28v=pandp.40%29.aspx#sec10
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

View 中对 ViewModel(即其 DataContext)的引用是否对 MVVM 模式有害? 的相关文章

随机推荐

  • 将数组除以值的有效方法是什么?

    只是想知道 将数组除以标量的最有效方法是什么 我可以清楚地循环它 但在我的情况下效率是最重要的 常见的琐碎方式 var array 2 var array 1 original data var divisor my scalar for
  • Windows C++ 服务启动时 ucrtbase.dll 出现故障

    所以我开发这个程序已经有一段时间了 它的目的是充当我们 IT 团队的资产管理器 将来可能会更多 我有 2 项服务 我们现在将其称为 Manager 和 IAM 管理器 负责所有服务 目前只有库存资产管理器 称为 IAM 的所有管理工作 例如
  • 未授予 Google Drive API 读取权限

    我正在尝试使用 Google Drive API 从 Google Drive 下载随机文件 尽管运行代码后我收到一条错误消息 用户尚未授予应用程序 app code 对文件 文件名 的读取权限 如何授予该文件的读取权限 我在互联网上和 A
  • 无法使用 Dockerfile 命令更新 Openssl.cnf 文件

    我正在开发一个基于 NET 5 构建的应用程序 我们生成 docker 映像 最近 我使用作为基础的自定义 Docker 映像之一遇到问题 我的应用程序中很少有外部端点 但出现 SSL 证书错误 在对这个问题进行了一些研究之后 我发现ope
  • 如何在 Silverlight 中设置 TextBox 的行为风格?

    在 Xaml 中 我可以为文本框添加自定义行为 例如
  • 如何获取“t”的值,以便我的函数“h(t)=epsilon”为固定的“epsilon”?

    继这个问题之后 如果我已经生成了m 1000随机向量x 0均匀分布在随机矩阵 GOE 的球体和特征向量上 make this example reproducible set seed 101 n lt 500 Sample GOE ran
  • 如何使用 Yarn 升级所有范围内的软件包?

    是否可以升级我的依赖项部分中的所有特定范围的包package json通过使用 Yarn 包管理器 例如 yarn upgrade scope 这将升级所有范围内的包yarn lock and package json file https
  • 使用pygame进行多线程处理,程序崩溃

    大家好 提前感谢您的帮助 我刚刚发现了 pygame 一个 python 库 我想用它玩一下 但我遇到了一个问题 我尝试在代码中使用线程 但每次启动程序时都会崩溃 我已经隔离了问题并且我知道它是thread 1这会导致崩溃 因为当我将其注释
  • 如何将文本输入与图像按钮对齐?

    我有一个表单 其中输入字段的最后一行后面跟着 2 个图像按钮 无论我尝试什么 我似乎都无法将按钮与字段水平对齐 这是所有代码 http jsfiddle net h3ZPk http jsfiddle net h3ZPk 添加此规则 but
  • 使用未声明的标识符 self [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我创建了一个名为 Data pars
  • ASP.Net 1.1 视图状态安全

    在 ASP Net 1 1 中 最终用户是否可以在将视图数据发送回服务器之前更改视图数据 例如使其看起来像是在不存在的下拉列表中选择了一个项目 我尝试使用 firebug 操作下拉列表中的值 但服务器似乎忽略了这一点 我推测是因为视图状态表
  • BigQuery Python 客户端库中查询结果的差异

    我想知道 query 的返回值和 query result 之间的区别 在 BigQuery Python 客户端库中 bigquery client bigquery Client myQuery SELECT FROM mytable
  • 将columnNames动态传递给cassandraTable().select()

    我在运行时读取文件的查询并在 SPark Cassandra 环境中执行它 我正在执行 sparkContext cassandraTable keyspaceName colFamilyName select col1 col2 col3
  • 如何关闭 PDO 句柄

    我正在使用 PDO 访问 PHP 中的两个 SQLite 3 数据库 我想在查询期间通过重命名数据库文件来切换数据库文件 但在文件打开时我无法执行此操作 因为它会给出文件正在被另一个进程使用的错误 我尝试关闭持久连接并将句柄设置为空 但都不
  • 从命令行模拟执行二进制文件?

    有没有办法从命令行在 Simics 模拟下执行简单的 Linux 二进制文件 就像是 simics some flags a out Simics 现在没有开箱即用的应用程序模式 或系统调用模式 根据需要 可以将有效负载编译为 ELF 文件
  • 在c#中的TREEVIEW中添加复选框

    我想添加复选框到我的应用程序中树视图中某个父节点的子节点 我应该如何添加它 TreeView拥有一个名为CheckBoxes 如果设置为true 它显示所有子节点的复选框
  • 可变长度表中的内存分配

    假设我在中定义了以下可变长度表WORKING STORAGE 01 SOAP RECORD 05 SOAP INPUT PIC X 8 VALUE SPACES 05 SOAP STATUS PIC 9 VALUE ZERO 05 SOAP
  • 将 Spongycastle 与 Proguard 一起使用

    我一直在努力使用 Proguard 来让 Spongycastle 正常工作 大多数时候 问题出现在我导出签名的 APK 时 要么出现错误 要么应用程序在启动前崩溃 因此 我设法收集信息以获得有效的混淆器配置 optimizationpas
  • 如何通过 Emacs 23.1 内置集成设置 SVN 密码?

    我正在 CentOS 6 2 上做一个项目 使用发行版提供的 Emacs 23 1 1 和使用 svnserver 的 subversion 我无法在任何地方找到如何设置存储库访问密码 关于此还有另一个问题 SVN for Emacs 如何
  • View 中对 ViewModel(即其 DataContext)的引用是否对 MVVM 模式有害?

    让我们说一个ViewModel发布一个Event and a View它正在使用该虚拟机作为其DataContext订阅该Event通过强制转换来获取对 VM 的引用DataContext到虚拟机实例 vm DataContext as M