3

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

我曾经将 Converters 放在 ViewModel 命名空间中,因为即使 View 发生变化,它们也经常是可重用的。但是,我看到越来越多的评论使它们更接近视图。请参阅以下问题的最佳答案:
您的 ViewModel 是否应该将 XAML 元素公开为属性?
WPF 转换器如何在 MVVM 模式中使用?

命令通常由 ViewModel 公开以实现 UI 事件,因此我也将它们放在 ViewModel 命名空间中。一个经典的例子是RelayCommands。然后我遇到了一个有趣的模式,即使用命令在主视图和 ViewModel 之间显示对话框。我发现它的简单性非常出色。该命令实际上只是一个代理,但显然是在 UI 领域。是还是不是?请参阅:
MVVM 和
使用 MVVM 处理 WPF 中的对话框

那么你认为命令和转换器应该放在 MVVM 中的什么位置呢?看法?视图模型?没关系?

4

1 回答 1

0

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

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

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

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

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

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

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

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

至于将它们放在哪里 - 通常我首先将它们放在 ViewModel 中,随着事情变得更加复杂,我会根据需要移动它们。这里有一篇有趣的文章,关于当事情变得复杂时你可以做什么:如何避免 ViewModel 中的命令混乱?

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

于 2012-10-01T11:37:25.830 回答