2009-06-17 58 views
2

Over StackOverflow问题How can WPF Converters be used in an MVVM pattern?我知道值转换器不应该用在MVVM模式中,因为值转换器的功能应该由ViewModel本身处理。您的ViewModel应该将XAML元素作为属性公开吗?

这是有道理的。

但我记得读过你应该不会将XAML元素暴露给视图,而是只显示View然后使用DataTemplates绑定和显示的数据集合。

然而,转换器似乎相当强大(例如,因为它们是在MVVM Template demo使用,请参阅“信使示例”拆包之后)在他们可以将对象转换为对象,例如消息对象到FlowDocument对象,或客户对象到可见性对象,或自定义状态对象到图像等

所以,如果一个ViewModel去承担价值转换器的功能,它将不得不公开XAML元素和属性,如StackPanel,Visibility,Color,FlowDocument等等,对吗?

有谁看到任何理由的价值转换器做一个视图模型不应该公开这些丰富的XAML对象?

回答

10

因为然后限制视图模型仅与特定的视觉表示一起使用。 当ViewModel发布XAML时,它将设计内容放入开发人员的域中。 这意味着使用Expression Blend的设计师不能编辑设计资产 - 而设计师/开发人员工作流程被打破。 将XAML保留在页面上,并将值转换器与数据模板一起使设计与代码分离。

当您的视图模型公开具体的XAML这也限制了视图模型只在特定的情况下使用,使得它不太重用。

1

我觉得MVVM/MVC/MVP等等的一个想法是GUI代码隔离到一个文件/类。 如果你这样做,你可以改变其他一些用户界面,而无需重写其他对象? 我想如果你传递WPF特定对象的答案是否定的。 这是一个价值判断,你必须为自己做出。

4

不要忘记,你可以使用的DataTemplates了。我可以看到保持ValueConverters不受MVVM的影响,但DataTemplates都是关于将对象转换为GUI的。

您的ViewModel可以将其他对象(例如嵌套的ViewModel)暴露给GUI,并且GUI可以使用<DataTemplate DataType="{x:Type SubViewModel}">...将这些对象映射到GUI。

3

有没有人看到任何理由为什么ViewModel不应该公开这些丰富的XAML对象值转换器呢?

绝对的,因为它破坏MVVM的所有目标:

  1. 你不再是单元测试,至少不容易。
  2. 逻辑(视图模型)和表示(视图)之间不再分离。因此,设计人员和开发人员不能轻松协作。
  3. 代码维护比较困难,因为您已将问题混合在一起。

如果我看到一个视图模型返回视图,我甚至不会将它归类为MVVM。

-1

没有绝对的100%规则适用于这个或许多其他概念,当你在讨论它们时没有考虑到社区的思维为什么会朝这个方向转变的原因。 “传统智慧”中不存在“假设的”真理或科学,无论当时有多么新或令人信服。

换句话说 - 只要你的团队尽力做到最好,你已经在人类的关注中获得了比任何真实的更多的东西。

相关问题