2010-09-27 57 views
1

我有一个WPF窗口中的文本框绑定到我的ViewModel中的字符串特权。我也有一个绑定到命令的按钮。该按钮是窗口中的默认按钮,因此按下Enter键后,该命令将运行。该命令仅在文本框不为空时启用。如何强制更改文本框以在WPF中启用我的命令?

如果我在文本框中输入,然后按回车键,所有按预期工作。

但是,该文本框也是从条形码扫描器接收条形码的地方,该条形码扫描器向键盘缓冲区添加代码。条形码扫描器“键入”条形码并按下Enter键(这是工作)。

问题是,如果文本框为空,则条形码扫描仪会填充它,但由于该命令尚未可用,因此不会捕获Enter。如果文本框以其中的某些内容开始,那么扫描条形码时,所有内容都能正常工作。

我的绑定是:

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

视图模型的财产通过INotifyPropertyChanged通知,我也尝试运行CommandManager.InvalidateRequerySuggested()设法得到命令变得可用,但无济于事。

+0

该命令是如何定义的? CanExecute()方法或动作的外观如何? – RoelF 2010-09-27 15:42:31

+0

公共DelegateCommand AddAssetCommand { 得到 { 如果(_addAssetCommand == NULL)_addAssetCommand =新DelegateCommand( E => {AddAsset();}, C => {返回string.IsNullOrWhiteSpace(条码);}) ; return _addAssetCommand; } } – BlackWasp 2010-09-27 15:51:27

+0

嗯。这并没有出现,但希望你能看到你所要求的那一点。 – BlackWasp 2010-09-27 15:51:47

回答

0

CommandManager.InvalidateRequerySuggested应该已经工作;但是我认为它也是异步的,所以如果扫描器非常快地发送击键,它可能会在WPF有机会更新所有内容之前发送输入。尝试拦截输入并延迟一点,也许用Dispatcher.BeginInvoke?

或调用CommandManager.InvalidateRequerySuggested与Dispatcher.Invoke具有高优先级(发送是我认为的最高)。

编辑此外,TextBox的默认行为只是更新LostFocus上的绑定,我假设您将其更改为PropertyChanged?没关系,在你的问题中看到它。

0

如果InvalidateRequerySuggested不起作用,您可能希望转到更简单的路由,并删除CanExecute约束,直接在Barcode值为空时禁用该按钮。

顺便说一句,你使用棱镜的DelegateCommand?如果是这种情况,那么InvalidateRequerySuggested完全不会被它使用,而是在命令上使用一个名为RaiseCanExecuteChanged的方法来触发UI上的更新。这将从图片中删除WPF的可视化树,以避免降低性能,假设您有所有信息来响应视图模型中的CanExecute请求。

+0

不是棱镜。我正在使用我自己的DelegateCommand。 – BlackWasp 2010-09-27 19:59:03

相关问题