MVVM和嵌套视图模型

33

我有一个简单的示例,其中创建了一个视图,包含一个列表框,该列表框显示了许多项目。我想知道在这里创建View Model和Model类的方法是否正确。在此上下文中使用“正确”的任何值都可以,我知道这有点主观,但我当前的解决方案感觉不对。以下是一个简化版本。

ViewModels 和 Models:

namespace Example
{
  public class ParentViewModel
  {
      public ParentViewModel()
      {
          // ... Create/Consume ChildViewModel * n
      }

      public List<ChildViewModel> ChildViewModels { get; set; }
  }

  public class ChildViewModel
  {
      public ChildViewModel()
      {
          // ... Create/Consume ChildModel
      }

      public ChildModel Model { get; set; }
  }

  public class ParentModel
  {
      public List<ChildModel> ChildModels { get; set; }

      public ParentModel()
      {
          // ... Create/Consume ChildModel * n;
      }
  }

  public class ChildModel
  {
      public ChildModel()
      {
          // ... Contains actual data.
      }

      public string Data { get; set; }
  }    
}

视图:

<Window x:Class="Example.View"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Example="clr-namespace:Example" Title="View" Height="300" Width="300"
    DataContext="{StaticResource TheViewModel}">
    <Window.Resources>
    <Example:ParentViewModel x:Key="TheViewModel" />
</Window.Resources>
<Grid>
    <ListBox Height="261" HorizontalAlignment="Left" Name="listBox1" VerticalAlignment="Top" Width="278" ItemsSource="{Binding ChildViewModels}"/>
</Grid>

在正确的代码中,列表框将使用数据模板来显示子视图模型。但正如您所看到的,我不确定如何实例化与子相关的对象。感觉父视图模型将引用父模型并根据父模型的子模型对象创建ChildViewModel对象。现在我已经这么说了,听起来不那么愚蠢,但我很想听听您的想法。

1个回答

25

你走在正确的道路上。

父模型自然包含子模型列表,例如一个客户拥有多个订单。

当第三方创建和加载ParentViewModel时,它会传递一个ParentModel。然后ParentViewModel将会:

  1. ParentModel分配给一个本地变量
  2. 通过将ChildModel传递给ChildViewModel构造函数为每个ChildModel创建一个ChildViewModel
  3. 将每个ChildViewModel添加到列表中

顺便说一句,您想要

public List<ChildViewModel> ChildViewModels { get; set; }

成为

public ObservableCollection<ChildViewModel> ChildViewModels { get; set; }

1
很有趣,我没想到Model会持有对ViewModel的引用,或者根本不知道它的存在。我以为View持有对ViewModel的引用,而ViewModel持有对Model的引用。但这可能是我混淆了MVC、MVP、MP、MVVM和其他无数变体 :) - Ian
19
抱歉,不行!模型从来不持有对视图模型的引用,而是相反的。基本上,视图模型知道模型,但不知道视图。视图只通过属性名称进行绑定,不知道视图模型或模型。 - Aliostad
哈哈,谢天谢地。这不是我第一次搞错了一切 :) - Ian
你会成功的,MVVM 是我最近面临的最大挑战之一。 - Aliostad
6
请注意,ViewModel可能完全不直接反映Models。VM是View需要展示的内容。因此,如果您想要显示子级的汇总信息,则ParentViewModel仅会公开该汇总信息(例如,子级数量;所有订单总和;所有收据总额的最小值和最大值),具体取决于您的视图需要展示什么。 - cod3monk3y
显示剩余2条评论

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