1个ViewModel真的有1个View吗?

时间:2010-02-16 11:40:44

标签: asp.net mvvm view user-controls viewmodel

它说1 ViewModel有1个View。

1 View对我来说是一个UserControl。如果我的UserControl具有填充来自不同实体的数据的不同区域,那么我是否有几个视图并需要构建多个ViewModel?

例如:我在UserControl中显示3个实体:customer(列表框),order(datagrid),product(datagrid)。每个“数据区”都添加+删除按钮和文本框以输入数据。

实际上,每个“数据区”都放在自己的GRID中,因此可以设置单独的datacontext。

1。)我现在应该创建3个ViewModels CustomerVM,OrderVM和ProductVM吗? 2.)这三个“数据区”是否被视为一种独立的视图,虽然我没有把它们放在3个UserControls.xaml文件中??? 3.)当这个UserControl在TabControl的标签页中时,我在哪里加载3个实体相关的数据?在MainViewModel里面?我想仅在用户点击tabheader时显示/加载该数据。

1 个答案:

答案 0 :(得分:4)

不,您可以在一个视图模型中执行所有操作。 viewmodel的工作是保存视图的数据,并在必要时转换该数据,以便视图可以使用它。没有任何迹象表明视图模型必须保存特定类型的信息,即没有规则声明“它可能只保存客户信息而不是订单信息”。

话虽如此,也没有理由认为几个不同的视图不能使用视图模型(当然,给它们提供所有不同的实例) - 这表明你的视图和视图模型之间的关注点很好。就个人而言,我编写了我的视图模型,以便他们不知道视图存在。尽管将CustomerView绑定到CustomerOrderProductViewModel的过程有点太过分了,但是视图也没有必要使用viewmodel公开的所有内容。

编辑:让我再解释一下最后一段。

Example 1: i have a new V which shows customer information, and i have an existing VM which has customer info AND order info

我不愿意将此VM用于此V,因为虽然它确实有我需要的客户端信息,但它有太多信息 - 我正在使用上下文中的VM最初是用于。

Example 2: i have a VM that contains full client info, like their postal and residential address, their phone numbers, their girlfriend's names*, and a bunch of other client type info. I have a V which shows the client's name, birthday, and maybe two other properties.

我会考虑将该VM用于该V,这说明我的观点是V不必显示VM中包含的所有信息。当您更改V时(例如,进行一些维护并更改视图的UI,因为有人已经决定要删除一堆字段,现在他们想要将客户端的年龄表示为图像),这个概念会变得更加明显 - 我仍然可以使用相同的VM,只需更改V(我可以使用ValueConverter将年龄表示为图像,从而避免更改VM)。

At what point would i stop using the current ClientViewModel, and write a new one that was more specific to the needs of the modified ClientView?

没有明确的答案 - 这取决于我可用于进行更改的时间,可用于测试的时间量以及使用完整的客户端对象之间的复杂性之间的权衡VM,并编写一个新的更精简的Client对象版本,同时仍保留旧版本。

*应该是一个包含在客户端对象中的独立对象的集合,但是在这里与我合作这是一个简单的例子:)