相对来说是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, 保罗
答案 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");
}
}