做或不做。 MVVM中的Valueconverters

时间:2011-06-13 22:38:03

标签: silverlight mvvm

我正在寻找确认/验证,我正在做的事情遵循模式并且是最佳实践,或者是某人口头上滥用我提交!

如果我在[insert control]上进行Visibility绑定,我将它绑定到System.Windows.Visibility类型的属性。然后我根据业务逻辑将此值设置为Visible / Collapsed。其中一个潜在的缺陷是我的VM属性现在直接绑定到我可以看到被抽象为值转换器的类型。话虽如此,我经常在MVVM讨论中读到不应该使用ValueConverters。

我可以得到一些反馈吗?

谢谢!

SS

4 个答案:

答案 0 :(得分:4)

我认为将值转换器用于常见的UI场景(比如将可见性绑定到布尔属性)是完全可以的。但是,仅将它们用于纯粹与UI相关的任务:不要将任何业务逻辑放在转换器中,它不属于那里。

答案 1 :(得分:1)

这是一个有争议的话题,但我坐在营地,我认为你不应该使用转换器。 ViewModel被认为是“类固醇转换器”,因此您不需要任何转换器。 (http://groups.google.com/group/wpf-disciples/browse_thread/thread/3fe270cd107f184f?pli=1)

如果你使用转换器,你会发现它们最终会在你的项目中到处都是最平凡的东西。例如:想要显示“3个客户”,但如果是“1个客户”则没有复数。在viewModel中很容易做到,但在转换器中变得非常繁琐。

答案 2 :(得分:1)

视图(XAML / WPF)和ViewModel负责不同的事情。因此,如果您正在操作ViewModel提供的数据,则最好在ViewModel中进行转换。但是,如果您需要纯粹的UI元素转换,那么视图是最适合它的地方。

E.G。我会说可见性是ViewModel的责任,因为可能存在一些关于所显示内容的业务规则。但是,在您更改标签的地方,复数可能应该是UI责任。此外,您可能决定使用触发器而不是转换器。这不应该是ViewModel的关注点。

我不相信你不应该使用某种东西,因为正在使用某种模式。这是一个关于何时应用它的判断,以及它是否使代码可测试,可维护并且在提供高质量的应用程序时易于理解。

答案 3 :(得分:0)

我是转换器的粉丝,但专门用于重用。在ViewModel中进行这些转换可能很容易,但如果您希望在许多ViewModel甚至15个不同的应用程序中进行相同的转换,该怎么办?如果您仅限于ViewModel方法,那么您将违反DRY。话虽如此,我完全同意转换器不应包含业务逻辑,不应用于“一次性”解决方案。

在上面提到的情况下,它需要ViewModel中的Visibility类型的属性,这对我来说是一个代码味道。恕我直言,ViewModes不应该反映视觉状态,而是View的视觉状态应该对ViewModel的数据状态做出反应。