MVVM和嵌套视图模型

时间:2010-12-06 13:13:50

标签: wpf mvvm

我有一个简单的例子,我正在创建一个包含列表框的视图,列表框显示一堆项目。我想知道我是否正确地在这里创建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>

在正确的代码中,列表框将使用数据模板来显示子视图模型。但正如你所看到的,我不确定如何实例化与子相关的对象。感觉ParentViewModel将引用ParentModel并基于ParentModel的ChildModel对象创建ChildViewModel对象。现在我说它听起来并不那么愚蠢,但我会对你的想法感兴趣。

1 个答案:

答案 0 :(得分:19)

你走在正确的轨道上。

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

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

  1. ParentModel分配给本地变量
  2. 通过传递,为每个ChildViewModel创建一个ChildModel ChildModelChildViewModel构造函数
  3. 将每个ChildViewModels添加到列表
  4. 顺便说一句,你想要

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

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