我想知道在MVVM中我是否应该设计转换器和命令更接近于Views或ViewModels。对我来说这是一个灰色区域,因为它们是弥合组件间隙的两种胶水对象。也许它并不重要,但我想知道Stack Overflow对此有何看法。
我曾经将转换器放在ViewModel命名空间中,因为即使视图发生更改,它们也经常可以重用。但是,我看到越来越多的评论使它们更接近视图。请参阅最佳答案:
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中?视图?视图模型?没关系?
答案 0 :(得分:0)
我不认为你可以说他们在一个阵营或另一个阵营。正如您所说,他们的目的是在ViewModel和View之间建立桥梁,同时保持它们不耦合。在我看来,你应该如何对待它们,作为胶水代码。
转换器 - 您可能会认为他们更接近视图,因为他们的责任与信息的调整方式有关,以便在xaml控件中轻松绑定和显示。
此外,理论上,您可以为同一个ViewModel属性使用两个不同的转换器,具体取决于您希望如何查看它。
但是如果需要的话,没有什么能阻止你在其他环境中使用它们,在某些地方根本不涉及View。
由于你的问题也暗示了把它们放在哪里,我把我的转换器分开,而不是在views文件夹中,也不在ViewModels文件夹中,以方便重用。
命令 - 通常由MVVM中的ViewModel公开,因此可以说它们更接近ViewModel,但根据我的经验,它们最常用于促进从ViewModel通过Bindings。如果我可以直接在xaml中绑定ViewModel方法调用,我将不再使用命令 - 对于简单的情况。
即使它们通常绑定到ViewModel,命令也可以在Views和ViewModel之间重用。如果您发现自己复制粘贴命令代码可以将它们分开,请将ViewModel放在接口后面并重复使用它们。
此外,命令模式在MVVM范围之外有许多用途。 (例如,您可以在应用程序逻辑中使用它来促进"撤消"功能)
至于放置它们的位置 - 通常我将它们放在ViewModel中,随着事情变得越来越复杂,我会根据需要移动它们。这是一篇有趣的帖子,讲述了当事情变得复杂时你可以做些什么:How can I avoid command clutter in the ViewModel?
我知道这是一个主观的答案,但我希望我提供了一些好的论据,我愿意接受意见。