您的ViewModel是否应将XAML元素作为属性公开?

时间:2009-06-17 15:18:28

标签: wpf silverlight xaml mvvm valueconverter

在StackOverflow问题 How can WPF Converters be used in an MVVM pattern? 上我已经了解到值转换器不应该在MVVM模式中使用,因为值转换器的功能应该由ViewModel本身

这是有道理的。

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

然而,转换器看起来非常强大(例如,在MVVM Template demo中使用它们,在解压缩后看到“Messenger示例”),它们可以将对象转换为对象,例如将对象传递给FlowDocument对象,将Customer对象传递给Visibility对象,或将自定义Status对象传递给Images等。

因此,如果ViewModel将采用值转换器的功能,则必须公开XAML元素和属性,例如StackPanel,Visibility,Color,FlowDocument等,对?

有没有人看到为什么ViewModel不应该像Value Converters那样公开这些丰富的XAML对象?

5 个答案:

答案 0 :(得分:10)

因为那样会限制ViewModel仅用于特定的可视化表示。 一旦您有ViewModel发出XAML,它就会将设计内容放入开发人员的域中。 这意味着使用Expression Blend的设计人员无法编辑设计资产 - 并且设计人员/开发人员的工作流程也会被破坏。 将XAML保留在页面上并使用带有数据模板的Value转换器可以将设计与代码分开。

当您的ViewModel公开特定的XAML时,它还限制ViewModel仅在该特定实例中使用,并使其不再可重复使用。

答案 1 :(得分:4)

不要忘记您也可以使用DataTemplates。我可以看到将ValueConverters保留在MVVM之外的一些意义,但DataTemplates都是关于将对象转换为GUI。

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

答案 2 :(得分:3)

  

有人看到为什么ViewModel不应该像Value Converters那样公开这些丰富的XAML对象吗?

当然,因为它破坏了MVVM的所有目标:

  1. 你不再是单元可测试的,至少不容易。
  2. 您不再需要逻辑(视图模型)和演示文稿(视图)之间的分离。因此,设计人员和开发人员无法轻松合作。
  3. 代码维护更加困难,因为您将这些问题混合在一起。
  4. 如果我看到视图模型返回视图,我甚至不会将其归类为MVVM。

答案 3 :(得分:1)

我认为mvvm / mvc / mvp等的一个想法是将GUI代码隔离到一个文件/类。 如果你这样做,你可以更改到其他UI而不重写其他对象吗? 我想如果你传递WPF特定对象的答案是否定的。 这是你必须为自己做出的价值判断。

答案 4 :(得分:-1)

当你讨论这个或许多其他概念时,没有绝对的100%规则适用于这个或许多其他概念,而没有看到为什么社区的思想在这个方向上已经发生了变化。 “传统智慧”中没有“假定的”真理或科学,无论当时有多么新颖或引人注目。

换句话说 - 只要与你的团队一起做到最好,好像你的好,你已经被人类关注的事情拉得远远超过了真实的事情。