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