C #, WPF, MVVM и INotifyPropertyChanged

Запуталась; Мне казалось, что я понял 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, и поэтому событие не распространяется вверх в графический интерфейс.

Это приводит меня к нескольким вопросам:

  1. Что именно должно подключаться к событию PropertyChanged? Я хочу быть более конкретным, чем просто «WPF». Какая связь между этим событием и оператором Binding в xaml?

  2. Почему начальное значение свойства передается пользовательскому интерфейсу при запуске, но не впоследствии?

  3. Право ли я иметь Simulator (модель), реализующий INotifyPropertyChanged , или это должна делать ViewModel? Если ViewModel делает это, то программные изменения в модели не запускают PropertyChanged, поэтому мне неясен правильный шаблон. Я понимаю, что моя ViewModel практически избыточна, но это из-за простоты проекта; более сложный вариант усложнит работу концепции ViewModel. Насколько я понимаю, ViewModel - это место для интерфейса моих модульных тестов.

9
задан ocodo 13 February 2011 в 12:20
поделиться