MVVM模式下的模型到视图模型的通信

8
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个简单的场景,其中包括一个视图、一个视图模型和一个自定义类型类。

模型类类似于:

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方法。

我希望让用户更改人名并调用另一个方法(通过Web服务搜索和其他内容...),我认为这个功能应该在ViewModel中。

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

现在我不知道是否应该使用中介者来解决这个问题,还是我应该知道另一种解决方法。


看起来你正在走一条好路。我看到你正在实现验证/INotifyPropertyChanged等功能。也许你想看看Csla.Net,它可以为你处理这些东西。它提供了一个框架来构建出色的模型,并为其支持的各种UI提供了一些帮助(基本上所有UI都支持)。http://www.lhotka.net/cslanet/ - Andy
1个回答

17

只需在您的视图模型中订阅Person的PropertyChanged事件并检查“Name”属性或任何您想要的属性:

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

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

1
那很简单!!谢谢你的帮助 :-D - zapico
1
我也遇到了同样的问题,本以为必须通过将ViewModel依赖属性传递来绑定View中的元素到ViewModel属性,然后再将ViewModel属性绑定到View属性。但这变得非常混乱,而且仍然无法正常工作。你的答案是一种非常简单的方法,可以在不费吹灰之力的情况下将模型更改传播到GUI。感谢你提供这个直截了当的答案! - Kyle Tolle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接