【问题标题】:MVVM - How to wrap ViewModel in a ViewModel?MVVM - 如何将 ViewModel 包装在 ViewModel 中?
【发布时间】:2012-07-31 04:38:58
【问题描述】:

首先,我已经阅读了this post 并没有找到我的问题的答案。

我不确定这是聚合的 Model 类还是聚合的 ViewModel 类,但这就是我所拥有的:

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

从服务返回的列表是这样的:

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

【问题讨论】:

  • WPF 不会绑定到字段。仅限属性。因此任何具有字段而不是属性的 POCO 都不能用作模型。
  • 你指的是哪个类?我的“ViewModel”类未绑定到 POCO!
  • 我的“视图”没有绑定到“CustomerDTO”(POCO)。它绑定到“CustomerViewModel”!
  • “首先 - 'CustomerDTO' 是所谓的模型吗?” “WPF 不会绑定到字段。仅限属性。因此,任何具有字段而不是属性的 POCO 都不能用作模型。”

标签: mvvm model viewmodel


【解决方案1】:

这样想:

  1. 视图是您的 UI,您可以将视图模型中的元素绑定到使用 {Binding Path=, Mode=TwoWay -- 如果您想根据用户输入进行更新
  2. 模型只是数据,可以是记录集、文件、数据库记录等。所以 CustomerDTO 和 OrderInfoDTO 是模型。
  3. 视图模型是数据(模型)和用户界面(视图)之间的链接。它将允许您更改数据,以便更轻松地在 UI 上显示

您需要在所有可能在后台更改列表的情况下使用 ObservableCollection。

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

【讨论】:

    猜你喜欢
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多