我仍然试图绕过MVVM。假设我的模型看起来像这样:
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,部门,员工中得到了一个很好的扩展/折叠界面......
除了:
如果网格可编辑怎么办...部门名称应该可以更改(并由ViewModel验证,对于员工名称也是如此..
如果我想添加新的员工,部门等,那么所有这些都应该反映在网格中而不重新绑定(这就是WPF数据绑定的重点不是吗?)
潜在解决方案:
每个Domain类都有一个单独的ViewModel类...
这似乎意味着很多来自DTO的映射 - &gt; ViewModel,复制(因为它们几乎是相同的对象,但并不完全相同。)鉴于我可能已经从某种ORM实体映射 - &gt;服务端的DTO,通过线路(WCF)将其发送到客户端,将每个DTO层次结构映射到自己的ViewModel是一个沉重而昂贵的过程(更不用说这样做所涉及的工作。)
将INotifyPropertyChanged,ObservableCollection等内容放到我的DTO中似乎是一种黑客行为。
有没有人有更好的解决方案?我疯了吗? ; - )
答案 0 :(得分:3)
“将INotifyPropertyChanged,ObservableCollection等内容放到我的DTO中似乎是个黑客。”
我感觉到你的痛苦,但这是我在几个项目中采取的方法。
底线:对于WPF数据绑定到“工作”,你所绑定的对象/集合需要支持INotifyPropertyChanged和ObservableCollection。
就我个人而言,我认为创建支持这一点的DTO比不断地将数据来回转换为视图模型或其他中间对象(本质上是DTO对象的更丰富版本)的工作少得多。
答案 1 :(得分:1)
如果您厌倦了输入INotifyPropertyChanged的代码并且还使用自动属性,为什么不看看MoXAML Power Toys,它允许您将自动属性转换为可通知的属性?