在MVVM中,一个视图是否只能绑定到一个ViewModel?

3
最近,在我的新Xamarin Forms项目中,我需要处理mvvm模式。在具有bindingContext的XAML页面代码中,ViewModel是Page。困难的部分是我的页面需要使用多个ViewModel来完成任务。例如,我的主页需要使用联系人ViewModel、用户ViewModel、城市ViewModel等数据。
我在互联网上搜索过,人们说我们应该为指定的视图使用一个ViewModel。那么,我想知道我是否应该创建一个包装所有以上ViewModel的新ViewModel,还是应该为该页面中的每个子视图设置不同的bindingContext。
有没有经验丰富的人在这种情况下,并且哪种解决方案最好。
3个回答

2

我会创建一个HomePageViewModel类,该类封装了其他一些类。

class HomePageViewModel
{
    UserViewModel user;
    ...
}

HomePageViewModel将成为HomePage的DataContext,子布局将被分配到相应的属性中。

2
-1 视图模型不应该包装其他视图模型。这样做会混淆您的视图要求与另一个视图的要求,从而违反了简化代码仅限于视图所需的尝试。 - Aaron Hawkins
首先,在软件中我认为没有严格的对错之分。其次,我们使用了一个ViewModel来封装其他模型。因此,即使您在ViewModel中使用ObservableCollection,它本身也是一种特殊的模型,用于通知视图。第三,UserViewModel和UserView可以在不同的地方重复使用。 - Adil

1
1:1关系与视图模型层次结构相悖的想法是误导性的,至少可以这么说。视图模型是视图的逻辑表示;因此,实现视图模型层次结构不仅符合架构,而且对于任何比“Hello World”应用程序更复杂的东西实际上是必需的!任何真实世界的应用程序都会有一个复杂的视图层次结构,因此根据定义,1:1关系要求在视图模型内具有类似的层次结构。这只是常识。
但不要仅仅听取我的意见,看看由这个主题的专家编写的任何代码,你会发现他们都做同样的事情。一个很好的起点是Josh Smith的“高级MVVM”(ViewModel Architecture Overview)第4章,其中即使他的简单应用程序也包含了一个高级VM,该VM封装了游戏和游戏结束的VM,并且游戏VM本身包含了独立的VM,用于字段和单个游戏元素。

-2

是的,在MVVM中,一个视图应该只绑定到一个单一的视图模型。我肯定不会从其他视图模型派生或包装。这里的主要思想是在特定于您的视图的视图模型中使用您的视图所需的模型,以便您可以轻松地查看此视图需要什么。它还允许您简化代码,因为您只需要编写使视图工作所需的代码,没有多余的。

使用WPF时,即使您的模型非常复杂,将视图模型用作父绑定上下文也很有效,因为它允许类导航。例如,您可以在视图模型中绑定到DataContext.User.Profile.FirstName。因此,您可以拥有一个视图模型,其中包含用户、联系人和地址属性。


ParentViewModel.User.Profile.FirstName 很糟糕。在这里,您正在向视图公开模型结构。请注意,有一个被接受的例外(仅限一级),即模型属性。 - H H
更新答案,应该绑定到由视图模型提供的通用DataContext。但是,它仍然可以期望从DataContext中了解属性导航。阅读https://msdn.microsoft.com/en-us/library/hh848246.aspx以获取更多详细信息。基本上,MVVM的动机是让设计师可以将视图松散地耦合在任何逻辑或代码之外。数据上下文理论上是可互换的,但这只是一个附带好处。 - Aaron Hawkins
1
请滚动到页面底部,找到指向第5章的链接。“一个视图的视图模型通常会返回对其他视图模型或模型类的引用,这是非常常见的。” - H H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接