视图是否只绑定到mvvm中的ViewModel?

时间:2015-10-11 14:43:44

标签: c# xaml mvvm xamarin xamarin-forms

最近,我必须在我的新xamarin表单项目中处理mvvm模式。 XAML上具有bindingContext的页面代码是ViewModel。困难的部分是我的页面需要使用多个ViewModel来完成我的任务。 例如我的HomePage需要使用联系ViewModel,用户ViewModel,城市ViewModel,......的数据。

我在互联网上搜索过,人们说我们应该只使用视图模型来指定视图。 所以,我想知道我是否应该创建一个包含上述所有viewmodel的新viewmodel,或者我应该为该页面中的每个子视图设置不同的bindingContext。

在这种情况下有经验的人,哪一个是最好的解决方案。

4 个答案:

答案 0 :(得分:1)

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

class HomePageViewModel
{
    UserViewModel user;
    ...
}

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

答案 1 :(得分:1)

至少可以说,1:1关系在某种程度上与视图模型层次结构相对立的想法是错误的。视图模型是视图的逻辑表示;因此,实现视图模型的层次结构不仅遵循体系结构,而且实际上是对比任何更复杂的事物要求的要求。应用程序!任何真实世界的应用程序都将具有复杂的视图层次结构,因此根据定义,1:1关系要求视图模型中的类似层次结构。这只是常识。

但是,不要只听我的话,看看专家就这个主题撰写的任何代码,你会发现他们都做同样的事情。一个很好的起点是Josh Smith的第4章"高级MVVM" (ViewModel体系结构概述),即使他的简单应用程序包含一个高级VM,它包含游戏和游戏虚拟机,游戏虚拟机本身也包含用于现场和单个游戏元素的独立虚拟机。

答案 2 :(得分:0)

  

我想知道我是否应该创建一个新的viewmodel,它包含以上所有viewmodel OR 我应该为该页面中的每个子视图设置不同的bindingContext。

你应该两个都做。

ViewModel为View提供服务,View只能绑定到一个VM。

  

我的主页需要使用联系ViewModel,用户ViewModel,城市ViewModel,...

的数据

当您的主页在子视图(UserControl,DataTemplate)中显示该数据时,ViewModel应具有保存其他ViewModel的属性。可能在ObservableCollections中。

应该存在联系人ViewModel,因为有一个Contact(子)视图,而不是因为有一个Contact Model类。

答案 3 :(得分:-1)

是的,视图应该只绑定到MVVM中的单个视图模型。我当然不会派生或包装其他视图模型。这里的主要思想是在视图特定于视图的模型中使用视图所需的模型,以便您可以轻松查看此视图​​所需的内容。它还允许您简化代码,因为您将只拥有使视图工作所需的代码,仅此而已。

使用WPF,即使您的模型相当复杂,使用视图模型作为父绑定上下文也能很好地工作,因为它允许类导航。例如,您可以绑定到视图模型中的DataContext.User.Profile.FirstName。因此,您可以拥有一个具有用户,联系人和地址属性的视图模型。