我在WPF窗口中有一个文本框,它在我的ViewModel中绑定了一个字符串proprty。我还有一个绑定命令的按钮。该按钮是窗口中的默认按钮,这样当按下enter键时,命令就会运行。该命令仅在文本框不为空时启用。
如果我输入文本框,然后按回车键,则所有操作都按预期进行。
但是,此文本框也是从条形码扫描器接收条形码的位置,该条形码扫描器将代码添加到键盘缓冲区。条形码扫描器“键入”条形码并按Enter键(这是有效的)。
问题是,如果文本框为空,条形码扫描器会填充它,但由于命令尚未可用,因此不会捕获回车。如果文本框以其中的内容开头,则扫描条形码时一切正常。
我的绑定是:
Text="{Binding Barcode,UpdateSourceTrigger=PropertyChanged}"
ViewModel的属性通过INotifyPropertyChanged
进行通知,我也尝试运行CommandManager.InvalidateRequerySuggested()
以尝试使命令可用但无效。
答案 0 :(得分:0)
CommandManager.InvalidateRequerySuggested
应该有效;但是我认为它也是异步的,所以如果扫描器发送的键击非常快,它可能会在WPF有机会更新所有内容之前发送输入。尝试拦截输入并稍微延迟它,也许使用Dispatcher.BeginInvoke?
或者使用具有高优先级的Dispatcher.Invoke调用CommandManager.InvalidateRequerySuggested
(我认为发送是最高的)。
编辑:另外,TextBox的默认行为只是更新LostFocus上的Binding,我假设您将其更改为PropertyChanged?没关系,在你的问题中看到它。
答案 1 :(得分:0)
如果InvalidateRequerySuggested不起作用,您可能想要转到更简单的路线,只需删除CanExecute约束,然后在条形码值为空时直接禁用该按钮。
顺便问一下,你使用Prism的DelegateCommand吗?如果是这种情况,则根本不使用InvalidateRequerySuggested,而是在命令中使用名为RaiseCanExecuteChanged的方法来触发UI上的更新。假设您拥有在视图模型中响应CanExecute请求的所有信息,这将从图片中删除WPF的可视化树以避免降低性能。