MVVM绑定,对象属性通知已更改

本文关键字:知已 通知 属性 绑定 对象 MVVM | 更新日期: 2023-09-27 18:29:32

MVVM的东西相对较新,我有以下问题:

我有一个对象"User",这个对象公开了一些属性,比如用户名、电子邮件等。。在mvvm模型中,我有一个属性:

    private IUser currentUser;
    public IUser CurrentUser
    {
        get
        {
            return this.currentUser;
        }
        set
        {
            this.currentUser = value;
            this.OnPropertyChanged("CurrentUser");
        }
    }
    private void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

在XAML中,TextBox绑定如下:

Text="{Binding CurrentUser.Email, Mode=TwoWay}"

更改电子邮件地址时,不会触发OnPropertyChanged,因此其他代码(如ICommands)不会"工作"。

当用户更改TextBox中的Text时,OnPropertyChanged是否会触发??

TIA,Paul

MVVM绑定,对象属性通知已更改

CurrentUser更改时,您正在启动PropertyChanged,但当前用户没有更改,您只是在更改其上的Email属性。快速解决方法是让Email属性传播CurrentUser的OnChange事件。

public string Email
{
    //get
    set
    {
        this.email = value;
        this.OnPropertyChanged("CurrentUser");
    }
}

事实上,我认为this.OnPropertyChanged("Email")也可以工作,但当您更改CurrentUser的属性时,它的setter肯定不会被调用。

INotifyPropertyChanged接口在哪里?我认为这是必要的。

属性更改通知不监视IUser类的属性。它只关注ViewModel属性CurrentUser(引用)的更改。

你需要

a) 使IUser实现INotifyPropertyChanged

b) 拉出EmailAddress并将其添加到ViewModel中,如下所示:

 public string Email
    {
        get
        {
            return this.CurrentUser.Email;
        }
        set
        {
            this.CurrentUser.Email = value;
            this.OnPropertyChanged("Email");
        }
    }