MVVM 疯狂:命令

2023-12-30

我喜欢MVVM。我不喜欢它,但是喜欢它。大部分都是有道理的。但是,我一直在阅读鼓励您编写大量代码的文章,以便您可以编写 XAML,而不必在代码隐藏中编写任何代码。

让我举一个例子。

最近,我想将 ViewModel 中的命令连接到 ListView MouseDoubleClickEvent。我不太确定该怎么做。幸运的是,谷歌对所有问题都有答案。我找到了以下文章:

  • http://blog.functionfun.net/2008/09/hooking-up-commands-to-events-in-wpf.html http://blog.functionalfun.net/2008/09/hooking-up-commands-to-events-in-wpf.html
  • http://joyfulwpf.blogspot.com/2009/05/mvvm-invoking-command-on-attached-event.html http://joyfulwpf.blogspot.com/2009/05/mvvm-invoking-command-on-attached-event.html
  • http://sachabarber.net/?p=514 http://sachabarber.net/?p=514
  • Link https://web.archive.org/web/20201027180030/http://geekswithblogs.net/HouseOfBilz/archive/2009/08/27/adventures-in-mvvm-ndash-binding-commands-to-any-event.aspx
  • http://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/ http://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/

虽然这些解决方案有助于我理解命令,但也存在问题。上述一些解决方案导致 WPF 设计器无法使用,因为常见的黑客行为是在依赖属性后附加“Internal”; WPF 设计者找不到它,但 CLR 可以。某些解决方案不允许对同一控件使用多个命令。某些解决方案不允许使用参数。

经过几个小时的实验后,我决定这样做:

private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
    ListView lv = sender as ListView;
    MyViewModel vm = this.DataContext as MyViewModel;

    vm.DoSomethingCommand.Execute(lv.SelectedItem);
}

那么,MVVM 纯粹主义者,请告诉我这有什么问题吗?我仍然可以对我的命令进行单元测试。这看起来很实用,但似乎违反了“ZOMG...你的代码隐藏中有代码!!!!”的准则。请分享您的想法。

提前致谢。


我认为错误在于纯度要求。设计模式(包括 MVVM)是工具箱中的一个工具,而不是其本身的目的。如果对于经过深思熟虑的案例来说,打破模型的纯粹性更有意义(并且显然您已经考虑过这种情况),那么就打破模型。

如果这对您有用,并且您不认为这是过度的维护负担,那么我会说您所做的一切没有任何问题。我认为您显然已经承担了举证责任,证明这是对您的问题的合理解决方案,无论纯 MVVM 实现是什么。

(我认为这个论点类似于多范式语言的论点。虽然可以应用纯 OO 方法,但有时以更函数式的方式做事更合适。虽然可以应用纯函数式方法,但有时权衡表明 OO技术比花时间更值得。)

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

MVVM 疯狂:命令 的相关文章

随机推荐

  • 从存储过程获取输出参数而不调用execute()

    我想通过实体管理器从 Java 程序中调用 PL SQL 存储过程 StoredProcedureQuery storedProcedureQuery entityManager createStoredProcedureQuery som
  • 自执行函数语法和回调语法解释

    也许是一个有点愚蠢的问题 但我想了解为什么自执行函数及其回调的语法与所有其他 JS 语法如此不同 function 我只需要理解为什么用它来封装它是有效的 我没想到这是有效的 然后额外的 之后的回调 它就直接位于它之后 我也不期望它是有效的
  • 使用嵌入的 dll 作为资源启动程序时出现问题

    我已经搞定了About com 在 Delphi EXE 中嵌入 dll 的指南 http delphi about com od windowsshellapi l aa012103c htm只要我实际上不使用 DLL 作为外部函数 这似
  • Laravel 5.3 Passport 自定义补助金?

    我知道我不是唯一一个走到这一步的人 有谁知道如何properly在 Laravel 5 3 Passport 中实现自定义授权 Or 有一个很好的链接 教程来参考如何正确执行此操作吗 我知道有这个包 https github com mik
  • 无法让动态 OrderBy 在我的通用列表上工作

    我无法让动态 OrderBy 在我的通用列表上工作 var list CacheObjects CompetencyAssessments Select x gt new CompetencyAssessmentLineViewModel
  • PHP 和 C++ 之间的套接字连接

    我在 PHP 页面和 C 代码之间创建了 TCP 套接字连接 这是这个的 C 代码 服务器 cpp include
  • Stripe JS 在状态更改时发出重复请求和新请求

    我在前端使用 stripe JS 库 只是设置令牌 实际上并没有使用该库来做任何事情 奇怪的是 当我加载任何页面条纹时 都会发出一堆奇怪的请求 其中很多都是重复的 通常它看起来像这样 https m stripe com 4 https m
  • 异步/等待中的重入?

    我有一个按钮 上面有一个async调用异步方法的处理程序 它看起来是这样的 private async void Button1 OnClick object sender RoutedEventArgs e await IpChanged
  • react-native run-android 部署旧版本

    我正在构建一个反应本机 Android 应用程序 我使用 Windows 作为我的开发区域 要将我的应用程序推送到手机 我只需通过 USB 将手机连接到计算机 然后运行命令react native run android 这在我的一部 An
  • xlim 不适用于离散值 [ggplot2]

    我正在尝试使用以下命令在 ggplot put 中设置 xlim 和 ylim ylim c 0 1 5 xlim c 0 100 OR coord cartesian xlim c 0 100 ylim 0 1 5 似乎抛出这个错误 Er
  • Winston 没有将日志写入文件

    我在 Winston 中对错误和警告进行了两次传输 据称这些传输会写入文件 现有的控制台日志记录传输工作正常 我确实检查过pm2 logs并看到了日志 但文件的传输没有说什么 use strict const winston require
  • 评论系统设计

    这是我目前的评论系统设计 我正在为一个有很多区域 博客 教程 手册等的网站开发它 正如应该为每个 tblBlogComments tblTutorialComments 等等 我试图寻求一种适合所有方法的结构 这样 我可以将评论系统变成一个
  • 获取整个语言文件数组

    我是新手拉拉维尔 4 0 如何从中获取整个数组lang en texts php 有没有Lang getAll method 我的目标是在我的基本控制器中生成关键字 描述 将它们填充到主刀片模板中 DO M 的元标记和其他位置 如果我的方法
  • Node.js WebRTC 客户端

    我正在寻找一个webrtc questions tagged webrtc实施node js questions tagged node js传输数据NodeJS 客户端到另一个 webRTC 对等点 所以就我而言 nodejs 应用程序是
  • 更新 Azure VM 规模集上的 VHD

    我已使用 Azure VM 的 vhd 在 Azure 上创建了 VMSS 如何将 VMSS 的源 vhd 更改为新的 vhd Get the following error 我们可以用Update AzureRmVmss and Upda
  • 使用openssl加密和解密小文件

    我想用 C C 编写一个小程序 它读取一个小文本文件 并使用 内部 密钥对其进行加密 然后我还想编写另一个小程序 它可以使用内部相同的密钥解密加密的文件 我查看了 openSSL 网站并用谷歌搜索 但发现不是简单的例子 有人尝试过做这件事吗
  • TypeError:stat:路径应该是字符串、字节、os.PathLike 或整数,而不是 _io.TextIOWrapper

    我在一个python教程网站上找到了以下代码 from nltk tag import StanfordNERTagger stanford classifier open english all 3class distsim crf se
  • Google Places API Android:自动完成关闭得太快

    我将 Place Autocompletion 添加到我的 Android 应用程序中 当我单击按钮时 chooseLocationButton 它会正确打开自动完成小部件 问题是当我想在搜索字段中写一个名字时 单击第一次击键后 自动完成小
  • 如何在 Asp.net 中使用 javascript 检测 IE 11

    您好 我想检测浏览器 IE 8 或更高版本适合我 为此 我使用了以下代码 但它对于 IE 11 失败 对于其他它的检测正确 function getInternetExplorerVersion var rv 1 Return value
  • MVVM 疯狂:命令

    我喜欢MVVM 我不喜欢它 但是喜欢它 大部分都是有道理的 但是 我一直在阅读鼓励您编写大量代码的文章 以便您可以编写 XAML 而不必在代码隐藏中编写任何代码 让我举一个例子 最近 我想将 ViewModel 中的命令连接到 ListVi