WPF:MVVM&编辑分层数据

时间:2009-09-11 16:55:02

标签: c# .net wpf silverlight mvvm

我仍然试图绕过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,部门,员工中得到了一个很好的扩展/折叠界面......

除了:

  1. 如果网格可编辑怎么办...部门名称应该可以更改(并由ViewModel验证,对于员工名称也是如此..

  2. 如果我想添加新的员工,部门等,那么所有这些都应该反映在网格中而不重新绑定(这就是WPF数据绑定的重点不是吗?)

  3. 潜在解决方案:

    每个Domain类都有一个单独的ViewModel类...

    这似乎意味着很多来自DTO的映射 - &gt; ViewModel,复制(因为它们几乎是相同的对象,但并不完全相同。)鉴于我可能已经从某种ORM实体映射 - &gt;服务端的DTO,通过线路(WCF)将其发送到客户端,将每个DTO层次结构映射到自己的ViewModel是一个沉重而昂贵的过程(更不用说这样做所涉及的工作。)

    将INotifyPropertyChanged,ObservableCollection等内容放到我的DTO中似乎是一种黑客行为。

    有没有人有更好的解决方案?我疯了吗? ; - )

2 个答案:

答案 0 :(得分:3)

“将INotifyPropertyChanged,ObservableCollection等内容放到我的DTO中似乎是个黑客。”

我感觉到你的痛苦,但这是我在几个项目中采取的方法。

底线:对于WPF数据绑定到“工作”,你所绑定的对象/集合需要支持INotifyPropertyChanged和ObservableCollection。

就我个人而言,我认为创建支持这一点的DTO比不断地将数据来回转换为视图模型或其他中间对象(本质上是DTO对象的更丰富版本)的工作少得多。

答案 1 :(得分:1)

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