MVVM和嵌套视图模型

Ian*_*Ian 27 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; }
  }    
}
Run Code Online (Sandbox Code Playgroud)

风景:

<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>
Run Code Online (Sandbox Code Playgroud)

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

Ali*_*tad 21

你走在正确的轨道上.

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

ParentViewModel由第三方创建和加载时,它将被传递给ParentModel.然后ParentViewModel意志:

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

顺便说一句,你想要的

public List<ChildViewModel> ChildViewModels { get; set; }
Run Code Online (Sandbox Code Playgroud)

成为

public ObservableCollection<ChildViewModel> ChildViewModels { get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 抱歉,没有!模型永远不会持有对ViewModel的引用,总是相反.基本上,ViewModel了解Model并且不了解View.View不知道视图模型或模型,只使用属性名称绑定. (13认同)
  • 另请注意,ViewModel可能根本不直接反映模型.VM是View需要显示的任何内容.因此,如果您正在显示子集的聚合,则ParentViewModel可能仅公开该聚合(例如,子计数;所有订单的总和;所有收据总计的最小值和最大值).取决于您的观点需求. (5认同)