2011-04-28 61 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