【问题标题】:MVVM Binding, Object Property Notification changedMVVM 绑定,对象属性通知已更改
【发布时间】:2013-08-28 15:12:44
【问题描述】:

对于 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, 保罗

【问题讨论】:

  • 当您将 CurrentUser 属性更改为其他用户时,您的属性更改通知将被触发。除非您在 IUser 上实现了 INotifyPropertyChanged,否则当您更改 IUser 的各个属性时它将不起作用.. 这似乎与您的观察相符。

标签: c# wpf mvvm


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您的 INotifyPropertyChanged 接口在哪里? 我觉得很有必要。

    【讨论】:

      【解决方案3】:

      属性更改通知不会监视您的 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");
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2010-11-23
        • 2016-03-28
        • 1970-01-01
        • 2013-05-01
        • 1970-01-01
        • 2015-10-29
        • 1970-01-01
        • 2020-04-01
        • 1970-01-01
        相关资源
        最近更新 更多