Событие WPF RaisePropertyChanged при потере фокуса

У меня есть приложение C # WPF MVVM, которое отлично работает.

Единственная проблема - когда я изменяю текстовое поле и нажимаю на меню. Если я сделаю это, не щелкнув другой элемент управления, событие view-> viewmodel никогда не будет запущено, потому что текстовое поле не потеряло фокус. Поправьте меня, если я ошибаюсь, но я думаю, что RaisePropertyChanged срабатывает только в LostFocus (или OnBlur, или в любом подобном событии).

Таким образом, нажатие кнопки сохранения в меню сразу после редактирования текстового поля приводит к тому, что модель просмотра сохраняет данные с использованием старых значений.

Итак, продолжая:

Эта последовательность работает нормально:

  1. Отредактируйте текстовое поле
  2. Щелкните другой элемент управления
  3. RaisePropertyChanged запускается, модель просмотра обновляется
  4. Нажмите кнопку сохранения в меню
  5. Данные сохранены с правильными значениями

Эта последовательность дает мне ошибку:

  1. Отредактируйте текстовое поле
  2. Нажмите кнопку сохранения в меню
  3. Данные сохранены с правильными значениями

Как это решить?


person guilhermecgs    schedule 03.07.2013    source источник


Ответы (2)


Это обычная проблема с текстовыми полями как в WPF, так и в WinForms. Вы можете обойти это, указав системе привязки обновлять виртуальную машину при каждом изменении TextBox, а не при потере фокуса. Для этого установите UpdateSourceTrigger привязки на PropertyChanged. Это будет записывать обратно в виртуальную машину каждый раз, когда TextBox вызывает событие PropertyChanged для своего свойства Text.

<TextBox Text="{Binding MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
person Michael Gunter    schedule 03.07.2013

Для свойства зависимостей TextBox.Text его значение по умолчанию _2 _ равно LostFocus (т.е. свойство вашей модели представления обновляется, когда элемент управления теряет фокус). Чтобы свойство обновлялось сразу после ввода текста, установите UpdateSourceTrigger=PropertyChanged. (См. Ссылку выше для получения дополнительной информации - на самом деле она охватывает конкретно ваш пример.)

person McGarnagle    schedule 03.07.2013