如何强制更改文本框以在WPF中启用我的命令?

时间:2010-09-27 15:30:15

标签: wpf

我在WPF窗口中有一个文本框,它在我的ViewModel中绑定了一个字符串proprty。我还有一个绑定命令的按钮。该按钮是窗口中的默认按钮,这样当按下enter键时,命令就会运行。该命令仅在文本框不为空时启用。

如果我输入文本框,然后按回车键,则所有操作都按预期进行。

但是,此文本框也是从条形码扫描器接收条形码的位置,该条形码扫描器将代码添加到键盘缓冲区。条形码扫描器“键入”条形码并按Enter键(这是有效的)。

问题是,如果文本框为空,条形码扫描器会填充它,但由于命令尚未可用,因此不会捕获回车。如果文本框以其中的内容开头,则扫描条形码时一切正常。

我的绑定是:

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

ViewModel的属性通过INotifyPropertyChanged进行通知,我也尝试运行CommandManager.InvalidateRequerySuggested()以尝试使命令可用但无效。

2 个答案:

答案 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的可视化树以避免降低性能。

相关问题