Какое событие следует использовать для обновления модели из TextBox (LostFocus, LostKeyboardFocus и т. Д.) В WPF? Как установить приоритет событий в WPF? - PullRequest
3 голосов
/ 15 декабря 2010

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

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

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

Тем не менее, вы не должны использовать события вообще здесь.Вы пытаетесь написать приложение 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) требуется, чтобы кнопка была включена, когда свойство строки является действительным, и отключена, когда оно отсутствует.

1 голос
/ 15 декабря 2010

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

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

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

...