Как не потерять обновления источника привязки?

Предположим, у меня есть модальный диалог с текстовым полем и кнопками ОК / Отмена. И он построен на MVVM, т.е. у него есть объект ViewModel со строковым свойством, к которому привязано текстовое поле.

Скажем, я ввожу текст в текстовое поле, затем беру мышь и нажимаю «ОК». Все работает нормально: в момент щелчка текстовое поле теряет фокус, в результате чего механизм привязки обновляет свойство ViewModel. Я получаю свои данные, все довольны.

А теперь предположим, что я не использую свою мышь. Вместо этого я просто нажимаю , введите на клавиатуре. Это также приводит к «щелчку» кнопки «ОК», поскольку она помечена как IsDefault = «True» . Но знаете что? Текстовое поле не не теряет фокус в этом случае, и поэтому механизм привязки остается невинно игнорирующим, и я не получаю свои данные. Черт возьми!

Другой вариант того же сценария: предположим, у меня есть форма ввода данных прямо в главном окне, я ввожу в нее некоторые данные, а затем нажимаю Ctrl + S для «Сохранить». Угадай, что? Моя последняя запись не сохраняется!

Это может быть несколько исправлено с помощью UpdateSourceTrigger = PropertyChanged , но это не всегда возможно.

Одним из очевидных случаев может быть использование StringFormat с привязкой - текст продолжает возвращаться в «отформатированное» состояние, когда я пытаюсь его ввести.

И еще один случай, который у меня есть. встретил себя, это когда у меня есть трудоемкая обработка в установщике свойств модели представления, и я хочу выполнять ее только тогда, когда пользователь "завершил" ввод текста.

Это похоже на вечную проблему: я помню, как пытался решить ее систематически из много лет назад, с тех пор, как я начал работать с интерактивными интерфейсами, но у меня никогда не получалось. Раньше я всегда прибегал к каким-то хитростям - например, добавлял метод EnsureDataSaved к каждому «презентатору» (как в «MVP») и вызывал его в «критических» точках или что-то в этом роде. ..

Но со всеми крутыми технологиями, а также с пустой шумихой вокруг WPF, я ожидал, что они найдут хорошее решение.

11
задан Fyodor Soikin 17 January 2011 в 03:12
поделиться