- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道在 MVVM 中我是否应该将转换器和命令设计得更接近 View 或 View 模型。这对我来说是一个灰色地带,因为它们是弥合组件之间间隙的两种类型的胶水对象。也许这并不重要,但我想知道 Stack Overflow 对此有何评论。
我曾经将 Converters 放在 ViewModel 命名空间中,因为即使 View 发生变化,它们通常也是可重用的。但是,我看到越来越多的评论使它们更接近 View 。查看以下问题的最佳答案:
Should your ViewModel expose XAML elements as properties or not?
How can WPF Converters be used in an MVVM pattern?
命令通常由 ViewModel 公开以实现 UI 事件,因此我也将它们放在 ViewModel 命名空间中。一个经典的例子是 RelayCommands .然后我遇到了一个有趣的模式,即使用命令在主视图和 ViewModel 之间显示对话框。我发现它的简单性非常棒。该命令实际上只是一个代理,但显然在 UI 领域。是还是不是?参见:
MVVM and Dialogs
Handling Dialogs in WPF with MVVM
那么您认为命令和转换器应该放在 MVVM 中的什么位置?看法? View 模型?没关系?
最佳答案
我认为您不能说他们属于一个阵营或另一个阵营。正如您所说,它们的目的是在 ViewModel 和 View 之间架起桥梁,同时保持它们不耦合。在我看来,这就是您应该如何对待它们,就像胶水代码一样。
转换器 - 您可能会争辩说它们更接近 View ,因为它们的责任与如何调整信息以便轻松绑定(bind)和显示在 xaml 控件中有关。
此外,理论上您可以为同一个 ViewModel 属性使用两个不同的转换器,具体取决于您希望如何查看它。
但是,如果需要,没有什么能阻止您在其他上下文中使用它们,在根本不涉及 View 的地方。
由于您的问题还暗示了将它们放在哪里,我将我的转换器单独放置,既不在 views 文件夹中,也不在 ViewModels 文件夹中,以方便重复使用。
命令 - 通常由 MVVM 中的 ViewModel 公开,因此可以说它们更接近 ViewModel,但根据我的经验,它们最常用于促进调用逻辑通过绑定(bind)的 ViewModel。如果我可以直接在 xaml 中绑定(bind) ViewModel 方法调用,我就不会再使用命令 - 对于简单的情况。
即使它们通常绑定(bind)到 ViewModel,命令也可以在 View 和 ViewModel 之间重复使用。如果您发现自己在复制粘贴命令代码,您可以将它们分开,将 ViewModel 放在接口(interface)后面并重用它们。
此外,命令模式在 MVVM 范围之外还有很多用途。 (例如,您可以在应用程序逻辑中使用它来促进“撤消”功能)
至于将它们放在哪里——通常我先将它们放在 ViewModel 中,随着事情变得越来越复杂,我会根据需要移动它们。这里有一篇有趣的帖子,介绍了当事情变得复杂时您可以做什么:How can I avoid command clutter in the ViewModel?
我知道这是一个主观的答案,但我希望我提供了一些好的论据,并且我愿意接受意见。
关于wpf - 从语义上讲,Commands 和 Converters 应该更接近 Views 还是 ViewModels?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12633865/
我想使用“SpeechSynthesizer”来朗读文本,但该文本包含一些 XML 标记。使用旧的 COM 对象,我使用了 S5Voice.Speak uString, SVSFDefault Or
我对 MIT OCW Python 第 3 课有疑问。 根据简单的数学计算,她使用的代码应该不会成功。 ## EXAMPLE: approximate cube root ##############
从 CSP193p 2015 第 15 讲开始,prepareForSegue 中的以下代码将弹出窗口的高度最小化为 iPad 上的两行标签和文本字段: let minimumSize =
我目前正在尝试完成 iTunes U 上的 Swift 类(class),我们正在构建一个计算器。我无法理解部分代码。 我在下面添加了我认为与文件相关的代码。 让我感到困惑的是:为什么 operati
无法理解 PHRASES 部分的代码。这是《Python 艰难之路》中的代码。那部分之后我很失落。有人可以解释一下吗? 书中没有对下面的代码进行任何解释。 import random from url
此问题来自 MIT Python 类(class) 6.00.1X,Lectrue 8。我尝试了两段略有不同的代码。两者都是为了计算每个学生的平均成绩。 第一个代码没有考虑到可能存在字母等级,第二个代
在第 6 讲 Stanford iOS9 2016 系列讲座中,程序中添加了一个名为 VCL.swift 的文件来演示 View Controller 生命周期。 我已经添加了文件,但是对于行 "pr
我是一名优秀的程序员,十分优秀!