【问题标题】:MVVM and nested view modelsMVVM 和嵌套视图模型
【发布时间】:2011-05-20 23:38:41
【问题描述】:

我有一个简单的例子,我正在创建一个由列表框组成的视图,列表框显示一堆项目。我想知道我是否要在这里正确地创建 View Model 和 Model 类。在这种情况下使用正确有效的任何值,我知道这有点主观,但我目前的解决方案感觉不对。这是一个简化版本。

ViewModel 和模型:

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 对象。现在我已经说过这听起来不那么愚蠢,但我会对你的想法感兴趣。

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    你在正确的轨道上。

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

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

    1. ParentModel 分配给局部变量
    2. 为每个ChildModel 创建一个ChildViewModel ChildModelChildViewModel 构造函数
    3. 将每个ChildViewModels 添加到列表中

    顺便说一句,你想要

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

    成为

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

    【讨论】:

    • 这很有趣,我不认为模型会持有对 ViewModel 的引用,或者根本不知道它。我假设 View 引用了 ViewModel,而 ViewModel 引用了 Model。这可能会让我混淆 MVC、MVP、MP、MVVM 和无数其他变体:)
    • 对不起,不!模型从不持有对 ViewModel 的引用,总是相反。基本上 ViewModel 知道 Model 而不知道 View。 View 不知道视图模型或模型,只使用属性名称进行绑定。
    • 哈,谢天谢地。这不会是我第一次把所有东西都放回前面:)
    • 你会成功的,MVVM 是我最近遇到的最艰巨的挑战之一。
    • 另请注意,ViewModel 可能根本不直接反映模型。 VM 是 View 需要显示的任何内容。因此,如果您要显示子项的聚合,ParentViewModel 可能只会公开该聚合(例如,子项的数量;所有订单的总和;所有收据总数的最小值和最大值)。取决于您的视图需要什么。
    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 2018-03-17
    • 2017-04-10
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多