2012-09-16 190 views
0

下面的代碼說明我的問題:綁定模型,避免代理屬性

public class Person : (INotifyPropertyChanged) // INPC only for PersonViewModelB 
{ 
    public string Name {get; set;} 
} 

public class PersonViewModelA : INotifyPropertyChanged 
{ 
    private Person _person {get; set;} 

    public string Name 
    { 
     get { return _person.Name; } 
     set { _person.Name = value; } 
    } 

    //XAML: {Binding Name} 
} 

public class PersonViewModelB : INotifyPropertyChanged 
{ 
    private Person Person {get; set;} 

    //XAML: {Binding Person.Name} 
} 

在許多例子中我已經看到過類似PersonViewModelA。我不明白這個好處。對我來說,PersonViewModelB更乾淨,更乾燥。

在這兩種情況下,我都可以爲ViewModel(例如IsSelected)或計算字段(例如Name = FirstName +「」+ LastName)添加額外的視圖特定字段。如果我有豐富的域模型,爲什麼我不能將它暴露給視圖?

在Asp.net MVC中,我們學會了將directy綁定到模型,並且它很好,但是在WPF中它不是?爲什麼?

什麼證明額外的開銷?

回答

0

MVVM不同於沒有視圖模型的MVC(並且更多的是三角形而不是線)。不直接綁定到模型的一個原因是保持最小的依賴關係,這樣如果模型更改,您可能只需要調整虛擬機,而不是虛擬機視圖和虛擬機視圖。

0

當您看到像A這樣的方法時,是因爲底層對象不支持INotifyPropertyChanged或者因爲實際實現需要靈活性。

看到Person可以改變,然後你需要重建你的用戶界面。但想想你的邏輯駐留在另一個DLL上的場景,並且你將ViewModel綁定到代理。然後,如果您的模型發生變化,則無需重新編譯您的用戶界面。