Я изучаю WPF из разработки WinForms.
У меня есть событие TextChanged, назначенное одному из моих TextBox в моем приложении WPF. Если пользователь вводит недопустимые данные, я хочу иметь возможность вернуться к предыдущему текстовому значению.
В день старых форм я бы заменил NewValue на OldValue, но похоже, что WPF работает иначе.
Есть идеи о том, что я могу сделать для этого? Я просто еще не думаю о WPF?
Спасибо.





Вы можете сделать это двумя способами:
Прослушайте событие PreviewTextInput и установите e.Handled = true, чтобы остановить событие TextChanged.
Используйте проверку WPF. Есть отличный пост Пола Стовелла на Codeproject и недавний пост в его блоге.
Эти статьи помогут вам начать работу. одна вещь, с которой я застрял, когда я впервые проводил проверку, - это то, что правило проверки выполняется только тогда, когда привязка обновляет источник.
PreviewTextInput не срабатывает, если пользователь вставляет текст в текстовое поле.
Это не сработает для вставки в TextBox, поскольку свойство Text установлено напрямую; если вы хотите предотвратить такие события, вам может потребоваться добавить обработчик для ApplicationCommands.Paste.
Я бы использовал PreviewTextInput, у большинства событий в WPF есть родственник Preview. Если вы установите e.Handled = true, это остановит событие от буббелига / туннелирования.
Я не уверен, знаете ли вы об этом, но события предварительного просмотра, как говорят, туннелируются, т.е. они начинаются с внешнего контейнера и размещаются в каждом контейнере до тех пор, пока не достигнут элемента управления, имеющего фокус. События без предварительного просмотра называются всплывающими, т.е. они начинаются с элемента управления с фокусом и отправляются в каждый родительский элемент управления.
Если вы установите e.Handled = true в событии PreviewTextChanged самой внешней сетки, вы также отмените все другие события, включая TextChanged. Сначала все события предварительного просмотра запускаются от самого внешнего к элементу управления с фокусом, затем все события без предварительного просмотра запускаются из элемента управления с фокусом и выходят на внешний родительский элемент управления.
Где PreviewTextChanged? Я могу найти только PreviewTextInput и TextChanged
Я не уверен, было ли оно переименовано или я ошибся в первом случае, но правильное событие - PreviewTextInput.
Отредактировал исходный ответ для состояния PreviewTextInput, НЕ PreviewTextChanged
Я сомневаюсь, что это можно было изменить в WPF, возможно, мы оба думали о событии WinForms. Мне просто нужно было обновить свой ответ на PreviewTextChanged.
Его PreviewTextInput не PreviewTextChanged!