WPF转换器如何在MVVM模式中使用?
假设我有一个视图绑定到具有可观察集合Customers的 ViewModel A.
这种MVVM模式的一个优点是,我还可以将视图绑定到ViewModel B ,并使用不同的数据填充它。
但是,如果在我的视图转换器转换器中显示我的客户,例如我有一个“ContractToCustomerConverter”,它接受合同并返回相应的客户以显示。
这个问题是,转换器存在于MVVM模式之外 ,因此不知道我的ViewModel有另一个客户来源。
(在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