4

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

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

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

4

3 回答 3

1

我会创建封装其他一些类的 HomePageViewModel。

class HomePageViewModel
{
    UserViewModel user;
    ...
}

HomePageViewModel 将成为 HomePage 的 DataContext 并且子布局将被分配各自的属性。

于 2015-10-11T15:02:19.913 回答
1

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

但是不要只相信我的话,看看专家们就这个主题编写的任何代码,你会发现他们都在做同样的事情。一个很好的起点是 Josh Smith 的“高级 MVVM”(ViewModel 架构概述)的第 4 章,其中即使是他的简单应用程序也包含一个封装游戏和游戏结束 VM 的高级 VM,并且游戏 VM 本身由单独的用于现场和单个游戏元素的虚拟机。

于 2015-10-11T21:50:33.903 回答
-1

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

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

于 2015-10-11T15:09:36.417 回答