MVVM - 如何在ViewModel中包装ViewModel?

时间:2012-08-02 08:19:14

标签: mvvm model viewmodel

首先,我已阅读this post但未找到问题的答案。

我不确定这是一个聚合的模型类还是聚合的 ViewModel 类,但这就是我所拥有的:

在我的WPF(使用Prism)应用程序中,我有一个视图'过滤客户视图',它连接到服务并根据过滤器请求“客户”对象列表。

从服务返回的列表是:

List<CustomerDTO>    FilteredCustomers;

CustomerDTO 如下所示:

public class CustomerDTO
{
    public    Guid                CustomerId;
    public    String              Name;
    public    String              Address;
    public    String              PhoneNumber;
    public    OrderInfoDTO        LastOrderInformation;
    public    List<OtherClass>    ListOfSomething;
}

OrderInfoDTO 如下所示:

public class OrderInfoDTO
{
    public    Guid          OrderId;
    public    DateTime      OrderDate;
    public    int           NumberOfProducts;
    public    double        TotalAmountSpent;
}

OtherClass 如下所示:

public class OtherClass
{
    public    Guid          Id;
    public    String        SomeText;
}

如您所见 - 客户可能有也可能没有'最后订单',

我想将< CustomerDTO '对象包装在 ViewModel 中, 这样我就可以将它绑定到视图。

这就是我的想法:

public class CustomerViewModel : NotificationObject
{
    private CustomerDTO    _customerDTO;

    public CustomerViewModel(CustomerDTO   customerDTO)
    {
        _customerDTO = customerDTO;
    }

    public Guid CustomerId
    {
        get  {  return _customerDTO.CustomerId;  }
        set  {  _customerDTO.CustomerId = value; RaisePropertyChanged("CustomerId "); }
    }

    public String Name
    {
        get  {  return _customerDTO.Name;  }
        set  {  _customerDTO.Name = value; RaisePropertyChanged("Name"); }
    }

    public String Address
    {
        get  {  return _customerDTO.Address;  }
        set  {  _customerDTO.Address = value; RaisePropertyChanged("Address"); }
    }

    public String PhoneNumber
    {
        get  {  return _customerDTO.PhoneNumber;  }
        set  {  _customerDTO.PhoneNumber= value; RaisePropertyChanged("PhoneNumber"); }
    }
}

问题:

  1. 首先 - 是'CustomerDTO'所谓的模型? 'OrderInfoDTO'也是模特吗?那么'OtherClass'呢?
  2. 如何处理 CustomerViewModel 类中的“OrderInfoDTO”?我也为它创建了一个'ViewModel'吗?我在哪里创建'OrderInfoDTO'视图模型???如果现在有人更新客户并设置'OrderInfoDTO'值,会发生什么?
  3. 如何处理 CustomerViewModel 类中的“OtherClass”列表?我为它创建一个ObservableCollection吗?如果有人想要删除其中的项目或更新其中的项目或向其添加项目会怎样?

1 个答案:

答案 0 :(得分:0)

以这种方式思考:

  1. 视图是您的UI,您可以将视图模型中的元素绑定到使用{Binding Path =,Mode = TwoWay - 如果您想根据用户输入进行更新
  2. 模型只是数据,这可以是记录集,文件,数据库记录等。所以CustomerDTO和OrderInfoDTO是模型。
  3. 视图模型是数据(模型)和UI(视图)之间的链接。它允许您更改数据,以便更容易在UI上显示
  4. 您需要在所有可能在后台更改的列表中使用ObservableCollection。

    除非您需要视图来更新该数据,否则您不需要OrderInfoDTO的视图模型。如果您在其中展示了OrderInfoDTO的CustomerDTO信息,那么将其作为CustomerDTO视图模型的属性就可以了。