WPF转换器如何在MVVM模式中使用?

假设我有一个视图绑定到具有可观察集合Customers的 ViewModel A.

这种MVVM模式的一个优点是,我还可以将视图绑定到ViewModel B ,并使用不同的数据填充它。

但是,如果在我的视图转换器转换器中显示我的客户,例如我有一个“ContractToCustomerConverter”,它接受合同并返回相应的客户以显示。

这个问题是,转换器存在于MVVM模式之外 ,因此不知道我的ViewModel有另一个客户来源。

  • 有没有办法让视图将ViewModel传递给Converter,以便它参与MVVM模式提供的解耦?
  • 有没有办法让我以某种方式在我的ViewModel中包含Converter,以便转换器使用ViewModel提供的当前依赖关系?
  • 或者转换器只是赞美代码隐藏 ,因此不用于MVVM模式,所以如果您使用的是MVVM,那么您只需创建您自己的“转换器”(您的ViewModel类中的方法),它将返回像Image对象,Visibility对象,FlowDocuments等在视图上使用,而不是使用转换器呢?
  • (在MVVM模板工具包下载附带的WPF演示应用程序中使用转换器后,我遇到了这些问题,请在解压缩包之后参阅“Messenger示例”。)


    我通常在MVVM中完全不使用转换器,除了纯粹的UI任务(例如BooleanToVisibilityConverter)。 恕我直言,您应该在您的ContractViewModel中声明CustomerViewModel类型的Customer属性,而不是使用ContractToCustomerConverter


    在这次对话中,有一条评论与肯特的立场一致,根本不用转换器,这很有趣:

    ViewModel基本上是类固醇的价值转换器。 它需要“原始”数据并将其转换为适合演示的内容,反之亦然。 如果您发现自己将元素的属性绑定到ViewModel的属性,并且您正在使用值转换器,请停止! 为什么不在ViewModel上创建一个暴露“格式化”数据的属性,然后完全删除值转换器?

    在这次对话中:

    MVVM体系结构中唯一可以看到值转换器使用的地方是跨元素绑定。 如果我将面板的可见性绑定到CheckBox的IsChecked,那么我将需要使用BooleanToVisibilityConverter。


    转换器应该很少用于MVVM。 事实上,我努力不使用它们。 虚拟机应该完成视图完成任务所需的一切。 如果视图需要Customer根据Contract ,应该有一个Customer在由VM逻辑每当更新VM物业Contract改变。

    这种MVVM模式的一个优点是,我还可以将视图绑定到ViewModel B,并使用不同的数据填充它。

    我反驳了这一说法。 根据我的经验,视图不是跨不同的VM类型共享的,也不是MVVM的目标。

    链接地址: http://www.djcxy.com/p/56209.html

    上一篇: How can WPF Converters be used in an MVVM pattern?

    下一篇: Making sure OnPropertyChanged() is called on UI thread in MVVM WPF app