MVVM 模型到 ViewModel 的通信

发布于 2024-11-04 02:34:23 字数 1496 浏览 0 评论 0原文

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

模型类类似于:

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();
            }
        }

在我的 View 中,我有一个绑定到 Person.name 的文本框

因此,ViewModel 不会执行 set 方法,因为 Person对象仍然是相同的...它正在执行 Model 属性 中的 set 方法。

我想让用户更改人名并调用另一个方法(搜索 Web 服务和其他内容...),我认为此功能应该位于 ViewModel 中。

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

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

I have a simple scenario with a View, a ViewModel and a custom type class.

The model class is something like:

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;

}

In the ViewModel I have a Person property:

private Model.Person person;

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

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

In my View I have a textbox that is bound to Person.name

So the ViewModel is not executing the set method because the Person object is still the same... it is executing the set method in the Model property.

I want to let the user change the person name and make a call to another method (search through a web service and other stuff...) and I think this functionality should be in the ViewModel.

I'm using Messenger from MVVM Light toolkit to communicate between different viewmodels and between views and viewmodels.

Now I don't know if I should use a mediator too for this or if I should know another way to solve this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

-柠檬树下少年和吉他 2024-11-11 02:34:23

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

Just subscribe to the PropertyChanged event of the Person in your ViewModel and check for the "Name" property, or whatever you wanna do:

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

void Person_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if(e.PropertyName == "Name")
    {
         //do something
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文