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