首页 文章

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

提问于
浏览
17

假设我有一个绑定到 ViewModel A 的View,它有一个可观察的集合 Customers .

这个MVVM模式的一个优点是我也可以将View绑定到 ViewModel B ,它用不同的数据填充它 .

但是,如果在我的 View converter Converters 中显示我的客户,例如我有"ContractToCustomerConverter"接受 Contract 并返回要显示的相应客户 .

这个问题是转换器 exists outside the MVVM pattern 因此不知道我的ViewModel有另一个客户来源 .

  • 是否有一种方法可以让 View to pass the ViewModel into the Converter 参与MVVM模式提供的解耦?

  • 有没有办法让我以某种方式 include the Converter in my ViewModel ,以便转换器使用ViewModel可用的当前依赖项?

  • 或转换器只是 glorified code-behind 因此没有在MVVM模式中使用,因此如果您使用MVVM,那么您只需创建自己的"converters"(ViewModel类上的方法),它们返回Image对象,Visibility对象,FlowDocuments等内容 . 在视图上使用,而不是使用转换器?

(在看到MVVM Template Toolkit download附带的WPF演示应用程序中使用转换器后,我发现了这些问题,解压缩后请参阅"Messenger Sample" . )

5 回答

  • 8

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

  • 0

    this conversation中有一条评论同意Kent的立场,而不是完全使用转换器,这很有趣:

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

    并在this conversation

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

  • 5

    转换器应该很少与MVVM一起使用 . 事实上,我努力不使用它们 . VM应该执行视图完成任务所需的所有操作 . 如果视图需要 Customer 基于 Contract ,则VM上应该有 Customer 属性,只要 Contract 更改,VM逻辑就会更新该属性 .

    这个MVVM模式的一个优点是我还可以将View绑定到ViewModel B,后者用不同的数据填充它 .

    我对这个说法提出异议根据我的经验,视图不是在不同的VM类型之间共享,也不是MVVM的目标 .

  • 11

    对于那些在视图中实际上没有说“非平凡转换器”的人,你如何处理以下内容?

    假设我有一个气候传感器模型,它代表给定位置的各种仪器(气压计,湿度计,温度计等)的时间序列读数 .

    假设我的视图模型从我的模型中公开了一个可观察的传感器集合 .

    我有一个包含WPF Toolkit DataGrid 的View,它绑定到View Model, ItemsSource 属性设置为可观察的传感器集合 . 如何为给定的传感器表示每种仪器的视图?通过使用转换器( TimeSeriesToSparklineConverter )将时间序列转换为图像源生成的小图(想想Edward Tufte sparkline

    以下是我对MVVM的看法:模型将数据暴露给View Models . 视图模型将行为,模型数据和状态公开给View . 视图可以直观地表示模型数据,并为符合视图模型状态的行为提供界面 .

    因此,我不相信迷你图像在模型中(模型是数据,而不是它的特定视觉表示) . 我也不相信迷你图像会出现在视图模型中(如果我的视图想要以不同的方式表示数据,比如显示系列的最小值,最大值,平均值,标准偏差等的网格行?) . 因此,在我看来,View应该处理将数据转换为所需表示的工作 .

    所以,如果我想暴露行为,模型在命令行界面而不是WPF GUI中,某个View Model的数据和给定状态,我不希望我的Model和我的View Model包含图像 . 这是错的吗?我们要 SensorCollectionGUIViewModelSensorCollectionCommandLineViewModel 吗?这对我来说似乎是错的:我认为视图模型是视图的抽象表示,而不是具体的,并且与这些名称所暗示的特定技术相关联 .

    这就是我对MVVM不断发展的理解 . 那么对于那些不使用转换器的人来说,你在这做什么?

  • 12

    我将在本次讨论中加上2美分 .

    我确实使用转换器,这是有意义的 .

    说明:在某些情况下,您需要在UI中以更多方式在Model中表示1个值 . 我通过1种类型公开了这个值 . 另一种是通过转换器处理的类型 . 如果要通过VM中的2个属性公开1个值,则需要手动处理更新通知 .

    例如,我有一个包含2个整数的模型: TotalCount ,_ DoneCount . 现在我希望这两个值都显示在TextBlocks中,另外我想显示完成百分比 .

    我使用 DivisionConverter 多转换器解决了这个问题,它采用了前面提到的2个 .

    如果我在VM中有特殊的 PercentDone ,我需要在更新 DoneCount 时更新此属性 .

相关问题