【问题标题】:Does 1 ViewModel really have 1 View?1 ViewModel 真的有 1 View 吗?
【发布时间】:2010-02-16 11:40:43
【问题描述】:

它说 1 ViewModel 有 1 View。

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

例如:我在 UserControl 中显示 3 个实体:客户(列表框)、订单(数据网格)、产品(数据网格)。每个“数据区域”都有添加+删除按钮和文本框来输入数据。

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

1.) 我现在应该创建 3 个 ViewModels CustomerVM、OrderVM 和 ProductVM 吗? 2.)这 3 个“数据区域”是否被视为一种自己的分离视图,尽管我没有将它们放在 3 个 UserControls.xaml 文件中??? 3.) 当这个 UserControl 在 TabControl 的标签页中时,我在哪里加载 3 个实体相关数据?在 MainViewModel 里面?我只想在用户单击选项卡标题时显示/加载该数据。

【问题讨论】:

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


    【解决方案1】:

    不,您可以在一个视图模型中完成所有这些操作。视图模型的工作是保存视图的数据,并在必要时转换该数据以便视图可以使用它。没有什么规定视图模型必须保存特定类型的信息,即没有规定“它只能保存客户信息而不是订单信息”的规则。

    话虽如此,视图模型也没有理由不能被几个不同的视图使用(当然,给它们所有不同的实例) - 这表明您在视图和视图模型之间有很好的关注点分离。就个人而言,我对我的视图模型进行编码,以便他们不知道视图存在。尽管将 CustomerView 绑定到 CustomerOrderProductViewModel 有点太过分了,但视图也没有理由必须消耗视图模型公开的所有内容。

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

    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 对象,同时仍保留旧版本。

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

    【讨论】:

    • 第一部分很清楚,最后一段很混乱 ;-) 所以我有一个 CustomerProductOrderViewModel 和一个 View ?您在最后一句中说相反:“......虽然将 CustomerView 绑定到 CustomerOrderProductViewModel 有点太过分了......”你能解释一下吗?
    • @msfanboy:slugster 是说使用一个非常具体的视图以完全不同的方式可视化另一个非常具体的视图模型有点令人不安。尽管 CustomerOrderProductViewModel 可能包含客户的所有属性,但它也有更多的信息表明,对于该视图模型使用简单的 CustomerView 是不可取的。这是一个很好的观察结果,可能会导致很多维护混乱。
    • 对不起安德森,但我确实听不懂你说的话。真的没什么。 CustomerOrderProductViewModel 不仅仅包含客户属性。它还包含 Order + Product 的属性以及 SelectedCustomers、SelectedProducts 和 SelectedOrders 等内容。选项 1:1 个视图/UserControl.xaml - 1 个数据上下文 - 1 个包含客户/订单/产品属性的视图模型 选项 2:1 个视图/UserControl.xaml - 在每个网格/“数据区域”上设置 3 个数据上下文,请参阅上面的说明 - 每个视图模型 3 个包含客户、订单、产品的属性。告诉我这样好吗?是/否?
    • 澄清我是否会在一个更大的 V 上使用多个 VM:这完全取决于复杂性。由于数据的性质,拥有一台 VM 会不会太复杂?或者拥有多个较小的虚拟机在架构上是纯粹的,但是真正的 PITA,因为每个虚拟机包含的唯一内容是对象的通用列表(即 List 是虚拟机上的唯一属性)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2019-11-08
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2016-09-19
    相关资源
    最近更新 更多