【问题标题】:Semantically, should Commands and Converters be closer to Views or ViewModels?从语义上讲,Commands 和 Converters 应该更接近 Views 还是 ViewModels?
【发布时间】:2012-09-28 05:03:12
【问题描述】:

我想知道在 MVVM 中我是否应该将转换器和命令设计得更接近于视图或视图模型。这对我来说是一个灰色地带,因为它们是两种类型的胶水对象,弥合了组件之间的差距。也许这并不重要,但我想知道 Stack Overflow 对此有什么看法。

我曾经将 Converters 放在 ViewModel 命名空间中,因为即使 View 发生变化,它们也经常是可重用的。但是,我看到越来越多的 cmets 将它们放置在更靠近视图的位置。查看以下问题的最佳答案:
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 中的什么位置?看法?视图模型?没关系?

【问题讨论】:

    标签: wpf xaml mvvm ivalueconverter icommand


    【解决方案1】:

    我认为你不能说他们在一个阵营或另一个阵营。正如你所说,它们的目的是在 ViewModel 和 View 之间架起一座桥梁,同时保持它们之间的解耦。在我看来,这就是您应该将它们视为胶水代码的方式。

    转换器 - 您可以争辩说它们更接近视图,因为它们的职责与如何调整信息以便在 xaml 控件中轻松绑定和显示有关。

    此外,理论上您可以为同一个 ViewModel 属性使用两个不同的转换器,具体取决于您希望如何查看它。

    但是如果需要的话,没有什么能阻止你在其他情况下使用它们,在某个地方根本不涉及视图。

    由于您的问题还暗示了将它们放在哪里,因此我将转换器分开放置,而不是在 views 文件夹中,也不在 ViewModels 文件夹中,以方便重用。

    命令 - 通常由 MVVM 中的 ViewModel 公开,因此可以说它们更接近 ViewModel,但根据我的经验,它们最常用于促进从ViewModel 通过绑定。如果我可以直接在 xaml 中绑定 ViewModel 方法调用,我将不再使用命令 - 对于简单的情况。

    即使它们通常绑定到 ViewModel,命令也可以在 View 和 ViewModel 之间重用。如果您发现自己复制粘贴了命令代码,您可以将它们分开,将 ViewModel 放在接口后面并重用它们。

    此外,命令模式在 MVVM 范围之外还有许多用途。 (例如,您可以在应用程序逻辑中使用它来促进“撤消”功能)

    至于将它们放在哪里 - 通常我首先将它们放在 ViewModel 中,随着事情变得更加复杂,我会根据需要移动它们。这里有一篇有趣的帖子,介绍了当事情变得复杂时你可以做什么:How can I avoid command clutter in the ViewModel?

    我知道这是一个主观的答案,但我希望我提供了一些好的论据,并且我愿意接受意见。

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 2012-12-31
      • 2013-05-15
      • 1970-01-01
      相关资源
      最近更新 更多