MVVM-如何在ViewModel中包装ViewModel?

MVVM-如何在ViewModel中包装ViewModel?,mvvm,model,viewmodel,Mvvm,Model,Viewmodel,首先,我读过,没有找到问题的答案 我不确定这是一个聚合的模型类还是聚合的视图模型类,但这就是我拥有的: 在我的WPF(带Prism)应用程序中,我有一个视图“Filter Customers view”,它连接到一个服务,并根据过滤器请求一个“Customer”对象列表 从服务返回的列表如下所示: List<CustomerDTO> FilteredCustomers; 另一个类如下所示: public class CustomerDTO { public Gu

首先,我读过,没有找到问题的答案

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

在我的WPF(带Prism)应用程序中,我有一个视图“Filter Customers view”,它连接到一个服务,并根据过滤器请求一个“Customer”对象列表

从服务返回的列表如下所示:

List<CustomerDTO>    FilteredCustomers;
另一个类如下所示:

public class CustomerDTO
{
    public    Guid                CustomerId;
    public    String              Name;
    public    String              Address;
    public    String              PhoneNumber;
    public    OrderInfoDTO        LastOrderInformation;
    public    List<OtherClass>    ListOfSomething;
}
public class OrderInfoDTO
{
    public    Guid          OrderId;
    public    DateTime      OrderDate;
    public    int           NumberOfProducts;
    public    double        TotalAmountSpent;
}
public class OtherClass
{
    public    Guid          Id;
    public    String        SomeText;
}
如您所见-客户可能有也可能没有“最后一次订单”

我想将“CustomerDTO”对象包装在视图模型中, 这样我就可以将它绑定到视图

这就是我想做的:

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"); }
    }
}

问题:


  • 首先,“CustomerTo”是被称为模型的吗?“OrderInfoDTO”也是一个模型吗?“其他类”呢
  • 如何处理CustomerServiceWModel类中的“OrderInfoDTO”?我是否也为其创建“视图模型”?在哪里创建“OrderInfoDTO”视图模型???如果现在有人更新客户并设置“OrderInfoDTO”值,会发生什么情况
  • 如何处理CustomerServiceModel类中的“OtherClass”列表?我是否为它创建了一个ObservableCollection?如果有人想删除其中的某个项目或更新其中的某个项目或向其中添加某个项目,会发生什么情况

  • 这样想:

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


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

    WPF不会绑定到字段。仅属性。因此,任何具有字段而非属性的POCO都不能用作模型。你指的是哪个类?我的“ViewModel”类没有绑定到POCO!我的“View”没有绑定到“CustomerTo”(POCO)。它绑定到“CustomerWebModel”!“首先,“CustomerTo”是什么模型?”“WPF不会绑定到字段。仅属性。因此,任何具有字段而非属性的POCO都不能用作模型。”