我有些困惑了,本以为自己理解了INotifyPropertyChanged。
我有一个小的WPF应用程序,前端是MainWindow类,中间是viewmodel,在后面是model。
在我的情况下,模型是Simulator类。
SimulatorViewModel几乎透明,只在MainWindow和Simulator之间接口属性。
Simulator实现了INotifyPropertyChanged,Simulator中的每个属性setter都调用RaisePropertyChanged方法:
private string serialNumber;
public string SerialNumber
{
get { return serialNumber; }
set
{
serialNumber = value;
RaisePropertyChanged("SerialNumber");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
在XAML中,我有一个带有以下绑定的文本框:
Text="{Binding Path=SerialNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
DataContext是SimulatorViewModel(但请注意更改DataContext为模型的注释)。
ViewModel只是简单地传递属性:
public string SerialNumber
{
get { return Simulator.SerialNumber; }
set { Simulator.SerialNumber = value; }
}
在模拟器中对属性SerialNumber进行程序化更新,但是奇怪的是,尽管在Simulator构造函数中设置了初始值,但这些更新并没有传播到UI。
如果我在Simulator中断SerialNumber setter,并跟随RaisePropertyChanged,我会发现PropertyChanged为null,因此事件不会向上传播到GUI。
这引出了几个问题:
应该将什么东西钩入PropertyChanged事件?我希望比“WPF”更具体。该事件与xaml中的Binding语句之间有何关联?
为什么初始属性值能够在启动时传播到UI,但后来却不能?
Simulator(模型)是否正确实现了INotifyPropertyChanged,或者应该由ViewModel执行?如果ViewModel执行,那么模型中的程序化更改不会触发PropertyChanged,因此我对正确的模式不清楚。我意识到我的ViewModel几乎是多余的,但这是由于项目的简单性;一个更复杂的项目将使ViewModel概念更加有效。我的理解是,ViewModel是接口我的单元测试的地方。