Предположим, у меня есть модальное диалоговое окно с текстовым полем и кнопками ОК/Отмена. И он построен на MVVM - т.е. Имеет объект ViewModel со строковым свойством, к которому привязано текстовое поле.
Скажем, я ввожу текст в текстовое поле, а затем возьмусь за мышь и нажмите "ОК". Все работает нормально: в момент щелчка текстовое поле теряет фокус, что заставляет механизм привязки обновлять свойство ViewModel. Я получаю свои данные, все счастливы.
Теперь предположим, что я не использую мышь. Вместо этого я просто нажал Enter
на клавиатуре. Это также приводит к тому, что кнопка "ОК" соответствует "click", так как она отмечена как IsDefault="True"
. Но угадайте, что? В этом случае текстовое поле не теряет фокус, и поэтому механизм привязки остается невинно невежественным, и я не получаю свои данные. Dang!
Другой вариант одного сценария: предположим, что у меня есть форма ввода данных прямо в главном окне, введите в него некоторые данные, а затем нажмите Ctrl+S
для "Сохранить". Угадай, что? Моя последняя запись не сохраняется!
Это может быть несколько устранено с помощью UpdateSourceTrigger=PropertyChanged
, но это не всегда возможно.
Одним очевидным случаем может быть использование StringFormat
со связыванием - текст продолжает прыгать обратно в "форматированное" состояние, когда я пытаюсь ввести его.
И еще один случай, с которым я столкнулся сам, - это когда у меня есть некоторая трудоемкая обработка в средстве определения свойств viewmodel, и я только хочу выполнить его, когда пользователь "выполнил" ввод текста.
Это похоже на вечную проблему: я помню, как пытался систематически ее решать давным-давно, с тех пор как я начал работать с интерактивными интерфейсами, но я никогда не преуспевал. Раньше я всегда использовал какие-то хаки - например, добавляя метод "EnsureDataSaved" каждому "ведущему" (как в "MVP" ) и вызывал его в "критических" точках или что-то в этом роде...
Но со всеми классными технологиями, а также пустой шумихой WPF, я ожидал, что они придумают хорошее решение.