2011-04-28 99 views
8

我有一個View,ViewModel和自定義類型類的簡單場景。MVVM模型到ViewModel通信

模型類是一樣的東西:

public class Person : Validation.DataError, INotifyPropertyChanged 
{ 
    #region INotifyProperty 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
    #endregion 


    public global::System.String name 
    { 
     get 
     { 
      return _name; 
     } 
     set 
     { 
      _name= value; 
      RaisePropertyChanged("name"); 
     } 
    } 
    private global::System.String _name; 

}

在視圖模型我有一個Person屬性:

private Model.Person person; 

     public Model.Person Person 
     { 
      get 
      { 
       return person; 
      } 
      set 
      { 
       this.person= value; 

       this.RaisePropertyChanged("Person"); 
       this.SavePersonCommand.OnCanExecuteChanged(); 
      } 
     } 

在我看來,我有一個綁定到一個文本框Person.name

因此,ViewModel未執行se t方法,因爲Person對象仍然是相同的......它正在執行Model屬性中的set方法。

我想讓用戶更改人名並調用另一個方法(通過Web服務和其他東西搜索......),我認爲這個功能應該在ViewModel中。

我使用MVVM Light工具包中的Messenger在不同的視圖模型之間以及視圖和視圖模型之間進行通信。

現在我不知道我是否也應該使用中介,或者如果我應該知道另一種解決方法。

+0

看起來你打算去一個好路徑。我看到你正在實施驗證/ INotifyPropertyChanged和東西。也許你想看看Csla.Net,它會爲你處理這些東西。它提供了一個構建偉大模型的框架,併爲它支持的各種UI(基本上都是這些UI)提供了一些幫助。 http://www.lhotka.net/cslanet/ – Andy 2011-04-28 17:02:02

+0

感謝您的建議,我會看看它;-) – zapico 2011-04-28 20:22:34

回答

14

只需訂閱您的視圖模型的人的PropertyChanged事件並檢查「名稱」屬性,或任何你想做的事:

Person.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(Person_PropertyChanged); 

void Person_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
{ 
    if(e.PropertyName == "Name") 
    { 
     //do something 
    } 
} 
+1

這是要走的路。 – Andy 2011-04-28 17:00:23

+1

太簡單了!感謝您的幫助:-D – zapico 2011-04-28 20:32:09

+1

我正在研究這個相同的問題,並認爲我必須通過給予ViewModel依賴項屬性,以便我可以將View中的元素綁定到ViewModel屬性,然後將ViewModel屬性綁定到View屬性。那變成了一團糟,仍然不起作用。您的答案是一種非常簡單的方法,可以將模型更改傳播到GUI,而不會帶來麻煩。感謝這個直接的答案! – 2012-11-14 20:24:47