Я запутался; Я думал, что понял INotifyPropertyChanged.
У меня есть небольшое приложение WPF с внешним интерфейсом класса MainWindow, моделью представления в середине и моделью сзади.
Модель в моем случае это класс Simulator.
SimulatorViewModel почти прозрачен и просто взаимодействует со свойствами между MainWindow и Simulator.
Имитатор реализует INotifyPropertyChanged, и каждый установщик свойств в имитаторе вызывает метод 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 у меня есть TextBox с привязкой:
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 не распространяются вплоть до пользовательского интерфейса, хотя, что любопытно, начальное значение, установленное в конструкторе Simulator, достигает этого.
Если я сломаюсь на установщике SerialNumber в симуляторе и последую в RaisePropertyChanged, я обнаружу, что PropertyChanged имеет значение null, и поэтому событие не распространяется вверх в GUI.
Что приводит меня к нескольким вопросам:
Что именно должно быть подключено к событию PropertyChanged? Я хочу быть более конкретным, чем просто "WPF". Какая связь между этим событием и оператором Binding в xaml?
Почему начальное значение свойства доходит до пользовательского интерфейса при запуске, но не впоследствии?
Прав ли я, чтобы Simulator (модель), реализующий INotifyPropertyChanged, или это должен был быть ViewModel? Если ViewModel делает это, то программные изменения в модели не вызывают PropertyChanged, поэтому я не уверен в правильности шаблона. Я понимаю, что моя ViewModel практически избыточна, но это связано с простотой проекта; более сложный - сделать концепцию ViewModel более сложной. Насколько я понимаю, ViewModel - это место для интерфейса моих модульных тестов.