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