比方说,我有一个绑定到一个视图模型具有可观察集合的客户视图。
此MVVM模式的一个优点是,我还可以结合观对视图模型B,其具有不同的数据填充它。
但是,如果在我的视点转换器转换器显示我的客户,比如我有接受合同并返回要显示相应的客户一个“ContractToCustomerConverter”。
这里的问题是,该转换器存在MVVM模式之外 ,因此不知道我的视图模型具有其它来源的客户。
- 是有观对视图模型传递到转换器 ,以便它在MVVM模式提供了解耦参与的方法吗?
- 是有我的方式以某种方式包括在我的视图模型的转换 ,使转换器采用其视图模型具有当前可用的依赖?
- 或者是转换器只是荣耀代码隐藏 ,因此在MVVM模式没有使用,所以如果你使用MVVM那么你只需要创建自己的“转换器”,它返回的东西喜欢的Image对象,可见对象,FlowDocuments(你的视图模型类的方法)等,以在视图上被使用,而不是在所有使用转换器?
(我看到在附带的WPF演示应用程序的使用转换器后,来到后这些问题MVVM模板工具包下载解压之后,看到“信使示例”。)
我通常不会在所有在MVVM使用转换器,除了纯UI任务(如BooleanToVisibilityConverter例如)。 恕我直言,你倒是应该申报类型CustomerViewModel的顾客财产在你ContractViewModel,而不是使用ContractToCustomerConverter
在这次谈话有与肯特的位置一致,完全不使用转换器评论,有趣的:
一个ViewModel基本上是对类固醇的值转换器。 它以“原始”的数据,并将其转换成一些演示友好,反之亦然。 如果你发现自己的元素的属性绑定到一个ViewModel的属性,您使用的是值转换器,停! 为什么不只是创建视图模型的属性暴露了“格式化”的数据,然后完全放弃了值转换器?
而在这次谈话 :
我可以看到在MVVM架构值转换器中使用的唯一的地方是跨元件绑定。 如果我绑定面板CheckBox的的器isChecked的可见性,那么我就需要使用BooleanToVisibilityConverter。
转换器应该很少与MVVM使用。 事实上,我努力并不是在所有使用它们。 虚拟机应该做的一切的观点需要得到它的工作做好。 如果视图需要Customer
根据Contract
,应该有一个Customer
在由VM逻辑每当更新VM物业Contract
改变。
此MVVM模式的一个优点是,我还可以结合观对视图模型B,其具有不同的数据填充它。
我声明提出异议。 根据我的经验,意见不能区分不同类型的虚拟机共享,并且也不是MVVM的目标。
对于那些实际上是说在视图中没有“非平凡的转换器”,你如何处理以下?
比方说,我有一个表示时间序列从给定的位置,各种仪器仪表(晴雨表,湿度计,温度计等)读数的气候传感器的型号。
比方说,我的视图模型公开从我的模型中的传感器可观察到的集合。
我有一个包含WPF工具包视图DataGrid
结合与视图模型ItemsSource
属性设置为传感器的观察的集合。 如何代表每个仪器的给定传感器的看法? 通过显示小图(认为爱德华托佛特火花这里),其是通过使用一个转换器中的时间序列变换为图像源产生的( TimeSeriesToSparklineConverter
)
这里是我怎么想的MVVM:模型公开数据视图模型。 视图模型公开行为,模型数据和状态进行查看。 意见做视觉上表示模型数据和提供接口与视图模型状态保持一致行为的工作。
正是如此,我不相信,所述火花图像模型去(型号是数据,而不是它的一个特定的可视化表示)。 我也不相信火花图像视图模型去(如果我的观想以不同的方式表示数据,也就是说,作为一个网格行只是显示最小值,最大值,平均值,标准偏差系列等?)。 因此,在我看来,该视图应该处理的数据转换成所需的代表性的工作。
所以,如果我要揭露在一个命令行界面,而不是一个WPF GUI某视图模型的行为,模型数据和给定的状态,我不希望我的模型,也不包含我的图像视图模型。 这是错的? 我们是否有一个SensorCollectionGUIViewModel
和SensorCollectionCommandLineViewModel
? 这似乎是我错了:我认为视图模型作为视图,而不是具体的,依赖于特定的施工技术的,因为这些名字暗示他们的抽象表示。
这就是我在我的MVVM的不断发展的理解在哪里。 因此,对于这些说法不使用转换器,你在这里做什么?
我要添加2美分,至本次讨论。
我使用转换器,它是有道理的。
说明:有你需要代表在UI更多的方式在模型1倍的值的情况。 我通过1种型暴露该值。 另一种类型是通过转换器来处理。 如果你是通过VM 2个属性来公开值为1,则需要手动处理更新通知。
比如我有2个整数模型: TotalCount
, DoneCount
。 现在我想显示在这两个的TextBlocks这个值,另外我想显示DONE百分比。
我解决这个使用DivisionConverter
多转换器,它需要2个前面提到的整数。
如果我有特殊的PercentDone
在VM,我需要更新此属性每当DoneCount
被更新。