如果您的视图模型公开XAML元素作为属性或不?(Should your ViewModel expo

2019-09-16 10:47发布

在在StackOverflow的问题如何WPF转换器在MVVM模式中使用? 我已经学会了,值转换器不应该在MVVM模式中使用,因为值转换器的功能应该由视图模型本身进行处理

这是有道理的。

但我记得读,你应该暴露XAML元素来查看 ,而是使用公开数据的DataTemplates该视图,然后结合的唯一收藏和展示。

然而,转换器似乎相当强大(例如,因为它们在使用MVVM模板演示 ,看到“信使示例”拆包后), 他们可以将对象转换为对象 ,例如消息反对FlowDocument的对象,或客户对象为能见度对象或自定义状态对象插入图片等

因此,如果一个视图模型是要采取一个值转换器的功能 ,这是不得不暴露XAML元素和属性,如StackPanel中,可见性,颜色,FlowDocument的,等等,对不对?

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

Answer 1:

因为那时限制视图模型仅与特定的视觉表示一起使用。 一旦你的视图模型发射XAML,它把设计内容到开发人员的领域。 这意味着使用Expression Blend的设计人员无法编辑设计资产 - 与设计师/开发工作流程被打破。 保持页面上的XAML和使用的价值转换器,数据模板保持从代码分离的设计。

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



Answer 2:

不要忘记,你可以使用的DataTemplates了。 我可以看到一些感觉在保持ValueConverters了MVVM的,但的DataTemplates都是关于变换对象为GUI。

您的视图模型可以露出其它对象(例如嵌套的ViewModels)到GUI,并且GUI可以使用<DataTemplate DataType="{x:Type SubViewModel}">...对这些对象到GUI绘制。



Answer 3:

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

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

  1. 你不再是单元测试,至少不容易。
  2. 你不再有逻辑(视图模型)和呈现(视图)之间的分离。 因此,设计人员和开发人员不能轻易合作。
  3. 代码维护比较困难,因为你已经混的关注在一起。

如果我看到一个视图模型返回一个观点,我不会把它归类为MVVM。



Answer 4:

我认为MVVM / MVC / MVP等等的一个想法是GUI代码隔离到一个文件/类。 如果你这样做,你可以改变一些其他的UI而无需重写其他对象? 我认为,如果你身边掠过WPF特定对象的答案是否定的。 这是一个价值判断,你必须让你的自我。



Answer 5:

没有绝对的100%规则这或许多其他概念,当你没有的,为什么社会的心态已经改变,因为它在这个方向的角度讨论他们的作品。 有一个在“传统智慧”不是“假设”真理和科学,无论它是多么新的或引人注目的时间。

换句话说 - 只要做到最好与你的团队,就好像你的好,你已经越来越远更比什么真正的,因为这个人的关注扯了下来。



文章来源: Should your ViewModel expose XAML elements as properties or not?