2

在 StackOverflow 问题上,如何在 MVVM 模式中使用 WPF 转换器?我了解到,值转换器不应该在 MVVM 模式中使用,因为值转换器的功能应该由 ViewModel 本身处理

这是有道理的。

但我记得读过你不应该向 View 公开 XAML 元素,而是只公开 View 然后使用 DataTemplates 绑定和显示的数据集合。

但是,转换器似乎非常强大(例如,它们在MVVM 模板演示中使用,解压后请参阅“Messenger 示例”),因为它们可以将对象转换为对象,例如将消息对象转换为 FlowDocument 对象,或将客户对象转换为 Visibility 对象,或自定义状态对象到图像等。

因此,如果 ViewModel 要承担 Value Converter 的功能,就必须公开 XAML 元素和属性,例如 StackPanel、Visibility、Color、FlowDocument 等,对吗?

有谁知道为什么 ViewModel 不应该像值转换器那样公开这些丰富的 XAML 对象?

4

5 回答 5

10

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

当您的 ViewModel 公开特定的 XAML 时,它还会将该 ViewModel 限制为仅在该特定实例中使用,并使其可重用性降低。

于 2009-06-17T15:27:38.503 回答
4

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

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

于 2009-06-17T15:33:38.833 回答
3

有谁知道为什么 ViewModel 不应该像值转换器那样公开这些丰富的 XAML 对象?

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

  1. 你不再是可单元测试的,至少不容易。
  2. 您不再有逻辑(视图模型)和表示(视图)之间的分离。因此,设计人员和开发人员无法轻松协作。
  3. 代码维护更加困难,因为您将关注点混合在一起。

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

于 2009-06-17T19:37:23.987 回答
1

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

于 2009-06-17T15:30:02.443 回答
-1

当您讨论这些概念时,没有绝对 100% 的规则适用于这个或许多其他概念,而没有了解为什么社区的思想已经朝着这个方向转变。“传统智慧”中没有“假定的”真理或科学,无论它在当时多么新颖或令人信服。

换句话说——只要和你的团队一起做最好的事情,就好像你是个好人一样,你已经在人类问题上被拖垮了,而不是像这样真实的事情。

于 2009-10-11T19:44:43.470 回答