2013-01-18 158 views
1

我有以下型號:WPF MVVM設計視圖模型

public class Person 
{ 
    public string LastName{get;set;} 
    public City City {get;set;} 
} 

public class City 
{ 
    public string Name {get;set;} 
} 

我有兩種觀點:

  • 一個用於顯示所有姓氏人員和城市中 一個DataGrid的名稱(AllPersonsViewModel )
  • 一個用於增加一個新的Person(PersonViewModel)

我AllPerso nsViewModel:

public class AllPersonViewModel : ViewModel 
{ 
    public ObservableCollection<PersonViewModel> PersonViewModels {get;set;} 
} 

我開始用下面的PersonViewModel:

public class PersonViewModel : ViewModel 
{ 
    private Person _person; 

    public string Name 
    { 
     get { return _person.Name;} 
     set { _person.Name = value; RaisePropertyChange("Name");} 
    } 

    public string CityName 
    { 
     get { return _person.City.Name;} 
    } 
} 

然後,我添加的屬性,添加一個新的人。在查看我需要的PERSONNAME和一個ComboBox一個文本框爲一個城市的選擇:

public class PersonViewModel : ViewModel 
{ 
    private Person _person; 

    public string Name 
    { 
     get { return _person.Name;} 
     set { _person.Name = value; RaisePropertyChange("Name");} 
    } 

    public string CityName 
    { 
     get { return _person.City.Name;}   
    } 

    public City SelectedCity 
    { 
     get { return _person.City;} 
     set { _person.City = value; RaisePropertyChange("SelectedCity");} 
    } 

    public ObservableCollection<City> Cities {get;set;} 
} 

這是正確的做法?這對我來說似乎有點多餘。在AllPersonsView的Grid中,我也可以直接綁定到「SelectedCity.Name」而不是額外的屬性CityName。該網格也是隻讀的。

+0

又是什麼問題? – khellang

+0

最後一段:「這是正確的方法嗎?對我來說似乎有點多餘。在AllPersonsView的Grid中,我也可以直接綁定到」SelectedCity.Name「而不是額外的屬性CityName。」 – LuckyStrike

+0

是的,我可以讀。我的觀點是你的問題非常模糊......這裏有沒有錯誤或正確的方法?如果有效,那麼可能是對的,如果不是的話,那可能是錯誤的。我不認爲城市應該是一個人的財產。 – khellang

回答

2

你有多個問題;

1 - 您不需要在AllPersonViewModel中聲明可觀察的視圖集合。只需聲明一個ObservableCollection Person即可。

2 - 不要添加CityName屬性;不像你所說的那樣需要。

3-不要添加Name屬性。將文本框綁定到Person的Name屬性。

+0

感謝您的回答。對於3,我必須將INotifyPropertyChanged添加到我的Person模型中,對嗎? – LuckyStrike

+0

@LuckyStrike yes;如果你沒有綁定ObservableCollections,你需要實現INotifyPropertyChanged。 – daryal

1

你的問題真的可以歸結爲「可以將我的模型直接暴露給視圖嗎?」一些純粹主義者會說不,而其他人會說,擁有一個封裝模型而不增加任何新功能的視圖模型是多餘的。

在我看來,它取決於手頭的任務,但當您需要添加不屬於模型的附加狀態時,「滑動」視圖模型可能會回來並咬你。如果有疑問,請使用視圖模型,但例如在列表中公開簡單模型對象時,您通常不需要視圖模型提供的額外圖層。

在你的情況,你都選擇了「純粹」的解決方案,並因爲你的模型對象不支持INotifyPropertyChanged如果模型屬性是由多種來源的變化,你無法擺脫的視圖模式。但不是提供一個CityName屬性,你可以綁定到SelectedCity.Name。 WPF支持數據綁定表達式中的屬性導航。

欲瞭解更多關於這個主題的洞察,你可以谷歌mvvm expose model