1

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

我有一个对象“用户”,这个对象公开了一些属性,如用户名、电子邮件等。在 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,保罗

4

3 回答 3

3

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

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

实际上我认为this.OnPropertyChanged("Email")也可以,但是当您更改 CurrentUser 的属性时,肯定不会调用 CurrentUser 的设置器。

于 2013-08-28T15:16:35.537 回答
2

属性更改通知不监视 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");
        }
    }
于 2013-08-28T15:17:12.743 回答
2

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

于 2013-08-28T15:16:11.420 回答