我仍在努力理解MVVM。假设我有一个类似于以下代码的Model:
public class Company
{
public IList<Division> Divisions { get;set;}
}
public class Division
{
public string Name { get;set;}
public IList<Department> Departments { get;set}
}
public class Department
{
public string UnitNumber { get;set;}
public string DepartmentName { get;set;}
public IList<Employee> Employees { get;set;}
}
public class Employee
{
public string FirstName { get;set;}
public string LastName { get;set;}
public string JobTitle { get;set;}
}
现在假设我想在一个层次网格中显示公司的层次结构,我创建了下面的 CompanyViewModel 类:
public class CompanyViewModel : INotifyPropertyChanged
{
private Company _company;
public Company Company
{
get { return _company;}
set { _company = value; NotifyPropertyChanged("Company");}
}
}
现在,对于我的视图(WPF),我将数据上下文设置为ViewModel,并且所选的数据网格将绑定到“Company”路径。到目前为止一切都很好......我得到了一个漂亮的可展开/折叠界面以查看Divions、departments和employees。
但是:
1. 如果网格是可编辑的... Department Names 应该可以更改(并由 ViewModel 进行验证),Employee Names 也是如此。
2. 如果我想添加新的 employees、departments 等,所有这些都应该在网格中反映出来,而不需要重新绑定(这是 WPF 数据绑定的重点,不是吗?)
潜在的解决方案:
为每个 Domain 类创建单独的 ViewModel 类...
这似乎意味着要从 DTO-> ViewModel 进行大量的映射,有重复(因为它们几乎是相同的对象,但并不完全相同)。鉴于我可能已经在服务端从某种 ORM 实体 -> DTO 进行映射,在发送它过程中使用了(WCF)客户端,将每个 DTO 层次结构映射到自己的 ViewModel 中是一个耗费时间且昂贵的过程(更不用说需要做的工作了)。
将 INotifyPropertyChanged、ObservableCollection 等东西渗透到我的 DTOs 中似乎是一个 hack。
有没有更好的解决方案?我疯了吗?;-)