【问题标题】:Should a View only bind to a ViewModel in mvvm?View 应该只绑定到 mvvm 中的 ViewModel 吗?
【发布时间】:2015-10-11 14:43:44
【问题描述】:

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

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

遇到过这种情况的任何人,哪一种是最好的解决方案。

【问题讨论】:

    标签: c# xaml mvvm xamarin xamarin-forms


    【解决方案1】:

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

    class HomePageViewModel
    {
        UserViewModel user;
        ...
    }
    

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

    【讨论】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • ParentViewModel.User.Profile.FirstName 太可怕了。您在此处将模型结构暴露给视图。请注意,one accepted exception to this rule(仅用于一层)是一个 Model 属性。
      • 更新了答案,因为它应该绑定到视图模型提供的通用 DataContext。但是,它仍然可以期望从 DataContext 中了解属性导航。阅读msdn.microsoft.com/en-us/library/hh848246.aspx 了解更多详情。基本上,MVVM 背后的动机是让设计人员可以创建与任何逻辑或代码松散耦合的视图。理论上,数据上下文可以互换,但这只是附带的好处。
      • 转到该页面的底部并找到指向Chapter 5 的链接,“视图的视图模型返回对其他视图模型或模型类的引用是很常见的”我>
      猜你喜欢
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多