Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM模型到视图模型的通信_C#_.net_Silverlight_Mvvm - Fatal编程技术网

C# MVVM模型到视图模型的通信

C# MVVM模型到视图模型的通信,c#,.net,silverlight,mvvm,C#,.net,Silverlight,Mvvm,我有一个带有视图、ViewModel和自定义类型类的简单场景 模型类类似于: public class Person : Validation.DataError, INotifyPropertyChanged { #region INotifyProperty public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged(string proper

我有一个带有视图、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对象仍然是相同的。。。它正在执行模型属性中的set方法

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

我正在使用MVVM Light toolkit中的Messenger在不同的视图模型之间以及视图和视图模型之间进行通信


现在我不知道我是否也应该为此使用中介,或者我是否应该知道解决此问题的另一种方法。

只需订阅ViewModel中此人的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
    }
}

看来你走的路不错。我看到您正在实施验证/INotifyPropertyChanged等。也许你想看看Csla.Net,它会帮你处理这些事情。它提供了一个框架,在此基础上构建伟大的模型,并为它所支持的各种UI(基本上所有UI)提供了一些帮助。谢谢你的建议,我来看看;-)那太简单了!!感谢您的帮助:-DI正在研究同一个问题,并认为我必须将ViewModel依赖项属性提供给,以便将视图中的元素绑定到ViewModel属性,然后将ViewModel属性绑定到View属性。那已经变成了一团乱麻,仍然不起作用。您的答案是一种非常简单的方法,可以将模型更改传播到GUI,而无需一大堆麻烦。谢谢你直截了当的回答!