2009-09-11 62 views
4

我仍然試圖繞過MVVM的頭。比方說,我有一個模型,它看起來是這樣的:WPF: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,選擇的數據網格將綁定到「公司」路徑。一切的偉大至今....我得到一個不錯的展開/摺疊界面進入Divions,部門,員工...

除外:

  1. 如果網格是可編輯...部門名稱應能夠被更改(並通過ViewModel進行驗證,對於員工姓名也是如此)。

  2. 如果我想添加新員工,部門等,所有這些都應該反映在網格中而不需要重新綁定(這是WPF數據綁定點不是嗎?)

潛在的解決方案:

你必須爲每個域類單獨ViewModel類...

這似乎從DTO暗示映射了很多 - >視圖模型,複製(因爲它們幾乎是相同的對象,但不完全)。鑑於我可能已經從服務端的某種ORM實體 - > DTO進行映射,通過有線(WCF)將其發送到客戶端,將每個DTO層次結構映射到其自己的ViewModel中一個沉重的,昂貴的過程(更不用說涉及這樣做的工作)。

像INotifyPropertyChanged, ObservableCollection等放入我的DTO中看起來像是一種破解。

有沒有人有更好的解決方案?我瘋了嗎? ;-)

回答

3

「將諸如INotifyPropertyChanged,ObservableCollection等流入我的DTOs之類的東西看起來像是黑客。」

我感到你的痛苦,但那是我在幾個項目上採取的方法。底線:對於WPF數據綁定,如所宣傳的那樣「工作」,您綁定的對象/集合需要支持INotifyPropertyChanged和ObservableCollection。

就我個人而言,我認爲創建支持DTO的工作比不斷地將數據來回轉換爲視圖模型或其他中間對象本質上是DTO對象的更豐富版本。

1

如果您厭倦了輸入INotifyPropertyChanged的代碼,並且您還使用自動屬性,爲什麼不看看MoXAML Power Toys,它允許您將自動屬性轉換爲可通知的屬性?