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

时间:2013-08-28 15:12:45

标签: c# wpf mvvm

相对来说是MVVM的新东西,我遇到以下问题:

我有一个对象“User”,这个对象公开了一些属性,比如Username,Email等。 在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中的文本时OnPropertyChanged会触发?

TIA, 保罗

3 个答案:

答案 0 :(得分:3)

当CurrentUser更改时,您正在触发PropertyChanged,但当前用户没有更改您只是更改其上的Email属性。快速修复可能是让Email属性传播CurrentUser的OnChange事件。

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

实际上我认为this.OnPropertyChanged("Email")也会起作用,但当你更改它的属性时,肯定不会调用CurrentUser的setter。

答案 1 :(得分:2)

您的INotifyPropertyChanged界面在哪里? 我认为这是必要的。

答案 2 :(得分:2)

Property Change Notification不会监视您的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");
        }
    }