WPF: MVVM与层次数据编辑

4

我仍在努力理解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。
有没有更好的解决方案?我疯了吗?;-)
2个回答

3
“在我的DTO中加入像INotifyPropertyChanged、ObservableCollection等流出的东西似乎是一种hack。”
我理解你的痛苦,但这是我在几个项目中采取的方法。
底线是:为了使WPF数据绑定如广告所述“工作”,您绑定到的对象/集合需要支持INotifyPropertyChanged和ObservableCollection。
就我个人而言,我认为创建支持此功能的DTO比不断地将数据转换为ViewModel或其他中间对象要容易得多,这些中间对象本质上是DTO对象的更丰富版本。

1

如果您已经厌倦了为INotifyPropertyChanged输入代码,而且还使用自动属性,为什么不看一下MoXAML Power Toys呢?它允许您将自动属性转换为可通知的属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接