Как я могу заставить изменение текстового поля включить мою команду в WPF? - PullRequest
1 голос
/ 27 сентября 2010

У меня есть текстовое поле в окне WPF, которое связано со строкой proprty в моей ViewModel.У меня также есть кнопка, которая связана с командой.Кнопка является кнопкой по умолчанию в окне, поэтому при нажатии клавиши Enter команда запускается.Команда включается только в том случае, если текстовое поле не пустое.

Если я наберу текстовое поле, а затем нажмите клавишу ВВОД, все работает, как ожидалось.

Однако это текстовое поле также является местом, которое получаетштрих-коды из сканера штрих-кодов, который добавляет коды в буфер клавиатуры.Сканер штрих-кода «печатает» штрих-код и нажимает Enter (это работает).

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

Моя привязка:

Text="{Binding Barcode,UpdateSourceTrigger=PropertyChanged}"

Свойство ViewModel уведомляется через INotifyPropertyChanged, и я также попытался запуститьCommandManager.InvalidateRequerySuggested() чтобы попытаться заставить команду стать доступной, но безрезультатно.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2010

Если InvalidateRequerySuggested не работает, вы можете перейти к более простому маршруту и ​​просто удалить ограничение CanExecute и вместо этого отключить кнопку непосредственно, когда значение Штрих-кода пусто.

Кстати, естьвы используете Prism's DelegateCommand?Если это так, то InvalidateRequerySuggested вообще не используется им, и вместо этого он использует метод RaiseCanExecuteChanged для команды, чтобы инициировать обновление пользовательского интерфейса.Это удаляет визуальное дерево WPF с картинки, чтобы избежать снижения производительности, при условии, что у вас есть вся информация для ответа на запрос CanExecute в вашей модели представления.

0 голосов
/ 27 сентября 2010

CommandManager.InvalidateRequerySuggested должно было сработать; однако я думаю, что он также асинхронный, поэтому, если сканер отправляет нажатия клавиш очень быстро, он может отправить ввод, прежде чем WPF сможет обновить все. Попробуйте перехватить ввод и немного задержать его, возможно, с помощью Dispatcher.BeginInvoke?

Или вызовите CommandManager.InvalidateRequerySuggested с помощью Dispatcher.Invoke с высоким приоритетом (я думаю, что Send - самый высокий).

Редактировать: Кроме того, поведение TextBox по умолчанию только для обновления привязки на LostFocus, я полагаю, вы изменили это на PropertyChanged? Неважно, видел это в вашем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...