假设我有一个绑定到 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 回答
我通常在MVVM中根本不使用转换器,除了纯UI任务(例如BooleanToVisibilityConverter) . 恕我直言,您应该在ContractViewModel中声明CustomerViewModel类型的Customer属性,而不是使用ContractToCustomerConverter
在this conversation中有一条评论同意Kent的立场,而不是完全使用转换器,这很有趣:
并在this conversation:
转换器应该很少与MVVM一起使用 . 事实上,我努力不使用它们 . VM应该执行视图完成任务所需的所有操作 . 如果视图需要
Customer
基于Contract
,则VM上应该有Customer
属性,只要Contract
更改,VM逻辑就会更新该属性 .我对这个说法提出异议根据我的经验,视图不是在不同的VM类型之间共享,也不是MVVM的目标 .
对于那些在视图中实际上没有说“非平凡转换器”的人,你如何处理以下内容?
假设我有一个气候传感器模型,它代表给定位置的各种仪器(气压计,湿度计,温度计等)的时间序列读数 .
假设我的视图模型从我的模型中公开了一个可观察的传感器集合 .
我有一个包含WPF Toolkit
DataGrid
的View,它绑定到View Model,ItemsSource
属性设置为可观察的传感器集合 . 如何为给定的传感器表示每种仪器的视图?通过使用转换器(TimeSeriesToSparklineConverter
)将时间序列转换为图像源生成的小图(想想Edward Tufte sparkline)以下是我对MVVM的看法:模型将数据暴露给View Models . 视图模型将行为,模型数据和状态公开给View . 视图可以直观地表示模型数据,并为符合视图模型状态的行为提供界面 .
因此,我不相信迷你图像在模型中(模型是数据,而不是它的特定视觉表示) . 我也不相信迷你图像会出现在视图模型中(如果我的视图想要以不同的方式表示数据,比如显示系列的最小值,最大值,平均值,标准偏差等的网格行?) . 因此,在我看来,View应该处理将数据转换为所需表示的工作 .
所以,如果我想暴露行为,模型在命令行界面而不是WPF GUI中,某个View Model的数据和给定状态,我不希望我的Model和我的View Model包含图像 . 这是错的吗?我们要
SensorCollectionGUIViewModel
和SensorCollectionCommandLineViewModel
吗?这对我来说似乎是错的:我认为视图模型是视图的抽象表示,而不是具体的,并且与这些名称所暗示的特定技术相关联 .这就是我对MVVM不断发展的理解 . 那么对于那些不使用转换器的人来说,你在这做什么?
我将在本次讨论中加上2美分 .
我确实使用转换器,这是有意义的 .
说明:在某些情况下,您需要在UI中以更多方式在Model中表示1个值 . 我通过1种类型公开了这个值 . 另一种是通过转换器处理的类型 . 如果要通过VM中的2个属性公开1个值,则需要手动处理更新通知 .
例如,我有一个包含2个整数的模型:
TotalCount
,_DoneCount
. 现在我希望这两个值都显示在TextBlocks中,另外我想显示完成百分比 .我使用
DivisionConverter
多转换器解决了这个问题,它采用了前面提到的2个 .如果我在VM中有特殊的
PercentDone
,我需要在更新DoneCount
时更新此属性 .