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

Edw*_*uay 2 silverlight wpf xaml mvvm valueconverter

在StackOverflow问题上如何在MVVM模式中使用WPF转换器?我已经知道值转换器不应该在MVVM模式中使用,因为值转换器功能应该由ViewModel本身处理.

这是有道理的.

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

但是,转换器似乎非常强大(例如,它们在MVVM模板演示中使用,在解压缩后看到"Messenger示例"),因为它们可以将对象转换为对象,例如将Message对象转换为FlowDocument对象,或将Customer对象转换为Visibility对象或自定义状态对象到图像等

因此,如果ViewModel将采用Value Converter的功能,它将不得不公开XAML元素和属性,如StackPanel,Visibility,Color,FlowDocument等,对吧?

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

Mic*_*ter 10

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

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