2013-04-04 16 views
3

作爲WPF的新成員,我最近開始了MVVM旅行。我可以理解爲什麼我們需要MVVM的原始內涵,但是一些實現細節仍然讓我困惑不已。對於MVVM,viewmodel導出模型中的屬性以查看最佳做法是什麼?

這裏是我的問題之一:

我應該如何通過ViewModel

model出口的財產,以View我可以告訴我的一些想法在這裏,所以請與我分享你的看法。

這是我實現的一個:

class MyModel : INotifyPropertyChanged 
    { 
     private String _name; 
     public String Name 
     { 
      get { return _name; } 
      set 
      { 
       if (_name != value) 
       { 
        _name = value; 
        if (PropertyChanged != null) 
        { 
         PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
        } 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 

    class MyViewModel 
    { 
     private MyModel _model; 

     public MyModel Model 
     { 
      get { return _model; } 
      set { _model = value; } 
     } 
    } 

我覺得這個問題是我們不分離從模型視圖。視圖需要了解模型實現的每個細節以完成綁定過程。在Model直接ViewModel出口的屬性不能被視爲一個好的設計在我看來。

所以我希望你可以分享你對這個主題的設計經驗。

BTW, 如果我們出口很多對象,比如,一個ListMyModel對象從視圖模型來查看的,我怎麼能實現這個解耦模型的觀點?

+1

視圖不需要知道模型實現的每個細節,視圖只需要知道要綁定的屬性的名稱。在你的情況下,這將是Name屬性。如果你有一些方法來格式化這個名字,那麼從數據庫中檢索這個名字等。這將在你的Model/ViewModel類中,並且視圖根本不需要知道任何一個=>解耦。 – failedprogramming 2013-04-04 03:25:14

回答

4

沒有,但你的ViewModel應執行INotifyPropertyChanged。然後,您可以在View中使用Binding從ViewModel獲取數據。

在您的視圖/ XAML你必須根據你要綁定什麼之類的語句

... Content="{Binding myViewModelProperty}" ... 

myViewModelProperty必須處於您的視圖模型的公共屬性

public string myViewModelProperty { get; set; } 

不要忘記調用RaiseNotifyPropertyChanged(或你的處理程序被調用)在二傳手得到的視圖更新。

private string myViewModelField; 

public string myViewModelProperty 
{ 
    get 
    { 
     return myViewModelField; 
    } 
    set 
    { 
     myViewModelField = value; 
     RaiseNotifyPropertyChanged(() => myViewModelProperty); 
    } 
} 

** **更新

解釋通常爲 「出口」 經由ObservableCollection<Type>。 理想情況下Type是這裏的一些ViewModel,用數據從模型創建到 顯示在你的視圖中。您可以將您的模型和您的視圖想像爲Adapter之間的ViewModel 。

+0

如果我這樣創建ViewModel,是否意味着我需要編寫代碼來將每個Model屬性映射到ViewModel proerpty?它太複雜了嗎? – winterTTr 2013-04-04 11:01:00

+0

這應該是微不足道的。有時候我會添加一個工廠方法,像'public SomeViewModel FromModel(SomeModel model)',它可以在幾行內完成這個映射。重要的一點是,您可以根據視圖調整模型數據,並且在模型更新的情況下可以清晰地分離關注點。 – 2013-04-04 11:03:17

+0

好的,謝謝你的建議 – winterTTr 2013-04-04 11:25:10

0

您只需將財產上的視圖模型綁定wiuth Model.Name

1

這不是一個嚴格的規則,但在我的情況下,我更喜歡在ViewModels中實現INotifyPropertyChanged,並將模型作爲簡單的POCO。

它可以是惱人的「回頭客」,在視圖模型的模型的屬性,但是:

  1. 一般來說,你不需要去揭露所有的屬性查看。
  2. 它允許您在VM中添加其他代碼,如用戶輸入驗證,並保持模型「乾淨」。

所以,在你的榜樣將是:

class MyModel 
    { 
     public String Name 
     { 
      get; 
      set; 
     }  
    } 

    class MyViewModel : ViewModelBase //let's say you have this base class in your framework 
    { 
     private MyModel model; 

     public MyViewModel(MyModel model) 
     { 
      this.model = model; 
     } 

     public string Name 
     { 
      get 
      { 
       return this.model.Name; 
      } 

      set 
      { 
       if(IsValidInput(value) 
       { 
        this.model.Name = value; 
        this.RaisePropertyChanged("Name"); // the ViewModelBase base class provide this helper. 
       } 
      }  
     }  
    } 

關於你的第二個問題,ObservableCollection通常是揭露模式的集合視圖的好辦法:

class ContactListViewModel 
{ 
    public ObservableCollection<MyModel> Contacts { get; private set;} 
} 
相關問題