Какое событие следует использовать для обновления модели из Textbox (LostFocus, LostKeyBoardFocus и т. Д.) В WPF? Как установить приоритет событий в WPF?

StackOverflow https://stackoverflow.com/questions/4447645

Вопрос

У меня есть приложение, в котором есть много текстовых полей и некоторых кнопок, таких как Save, Saveas и т. Д.

Когда пользователь редактирует текстовое поле, я должен проверить базу данных для некоторого диапазона, проверить диапазон и обновить базу данных. Если есть какая -либо ошибка в значении, введенном пользователем, я не должен позволять текстовому поле потерять фокус.

Я использовал мероприятие Lostfocus Для этого, и он работал нормально, пока в последнее время я обнаружил ошибку в своем приложении.

Ошибка : Пользователь редактирует значение в текстовом поле, а затем нажимает кнопку «Сохранить»; Событие LostFocus не называется, и поэтому база данных не обновляется :(

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

Примечание : ** Кнопки находятся в разных usercontrol!

РЕДАКТИРОВАТЬ 1: У меня есть некоторые команды, прикрепленные к нажатию кнопок, эти команды выполняются до LostFocus !! Могу ли я установить приоритет или что -то вроде прикрепленного поведения или команд, должно быть выполнено после LostFocus !!

РЕДАКТИРОВАТЬ 2: Я только что отлаживал приложение, отключив некоторые команды, я обнаружил, что в некоторых случаях DelegateCommand выполняется до LostFocus, поэтому я хочу избежать этого. Как я могу это сделать? Я чувствовал, что во время разработки его невозможно разработать чистое приложение MVVM, поэтому я как бы использовал немного кода!

Это было полезно?

Решение

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

Тем не менее, вы не должны использовать события здесь. Вы пытаетесь написать приложение Windows Forms в WPF. Вы должны написать приложение WPF.

Создайте класс, который является логической моделью вашего взгляда - т.е. есть string свойство для текстового поля и Command собственность (или, скорее всего, RelayCommand) для кнопки Сохранить. Свяжите текстовое поле с свойством строки, например:

<TextBox Text="{Binding MyTextProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

Поскольку UpdateSourceTrigger является PropertyChanged, исходный объект будет обновляться каждый раз, когда пользователь набирает символ.

Свяжите кнопку с свойством команды, например:

<Button CommandBinding="{Binding SaveCommand}">Save</Button>

Реализовать соответствующий CanSave а также Save Методы, которые RelayCommand (как описано в Джош Смит Основная статья на шаблоне MVVM требуется, чтобы кнопка включена, когда свойство строки действительна и отключена, когда это не так.

Другие советы

Я думаю, что лучший подход - это предотвращение продолжения пользователя до тех пор, пока не будет собрана вся достойная информация.

Так же, как мастер установки с Terms & Conditions Dialog а также Next кнопка. Пока вы не проверьте I Agree флажок, Next кнопка отключена.

Таким образом, вам не нужно беспокоиться о разбирательстве пользователя, не предоставляя действительную информацию. Таким образом, вы можете использовать любое событие на TextBox Чтобы подтвердить ваши данные.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top