【问题标题】:MVVM Model to ViewModel communicationMVVM 模型到 ViewModel 通信
【发布时间】:2011-08-14 21:13:03
【问题描述】:

我有一个包含 View、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;

}

在 ViewModel 我有一个 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 没有执行 set 方法,因为 Person 对象还是一样的……它正在执行 Model 属性中的 set 方法。 p>

我想让用户更改人名并调用另一个方法(通过网络服务和其他东西搜索...),我认为这个功能应该在 ViewModel 中。

我正在使用来自 MVVM Light 工具包的 Messenger 在不同的视图模型之间以及视图和视图模型之间进行通信。

现在我不知道我是否也应该为此使用调解器,或者我是否应该知道另一种方法来解决这个问题。

【问题讨论】:

  • 看起来你走上了一条好路。我看到您正在实施验证/ INotifyPropertyChanged 等。也许您想查看 Csla.Net,它将为您处理这些事情。它提供了一个框架来构建出色的模型,并为它支持的各种 UI(基本上所有这些)提供了一些帮助。 lhotka.net/cslanet
  • 谢谢你的建议,我去看看;-)

标签: c# .net silverlight mvvm


【解决方案1】:

只需在您的 ViewModel 中订阅 Person 的 PropertyChanged 事件并检查“名称”属性,或者您想做的任何事情:

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

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

【讨论】:

  • 就是这么简单!!感谢您的帮助:-D
  • 我正在研究同样的问题,并认为我必须通过提供 ViewModel 依赖属性来将 View 中的元素绑定到 ViewModel 属性,然后将 ViewModel 属性绑定到 View 属性。那变成了毛茸茸的烂摊子,但仍然无法正常工作。您的答案是将模型更改传播到 GUI 的一种非常简单的方法,而不会带来很多麻烦。感谢您的直截了当的回答!
猜你喜欢
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多