代码之家  ›  专栏  ›  技术社区  ›  BlackWasp

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

wpf
  •  1
  • BlackWasp  · 技术社区  · 14 年前

    我在WPF窗口中有一个文本框,它绑定到ViewModel中的字符串属性。我还有一个绑定到命令的按钮。按钮是窗口中的默认按钮,因此当按下enter时,命令将运行。仅当文本框不为空时才启用该命令。

    然而,这个文本框也是从条形码扫描仪接收条形码的地方,条形码扫描仪将代码添加到键盘缓冲区。条形码扫描器“键入”条形码并按回车键(这正在工作)。

    问题是,如果文本框为空,条形码扫描仪将填充文本框,但由于命令尚未可用,因此无法捕获输入。如果文本框以某个内容开头,则扫描条形码时一切正常。

    我的装束是:

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

    INotifyPropertyChanged 我还试着跑 CommandManager.InvalidateRequerySuggested() 试图使命令变为可用但没有用。

    2 回复  |  直到 14 年前
        1
  •  0
  •   Alex Paven    14 年前

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

    或调用 CommandManager.InvalidateRequerySuggested命令 使用Dispatcher.Invoke具有高优先级(Send是我认为最高的)。

    编辑:同样,文本框的默认行为只是更新LostFocus上的绑定,我假设您将其更改为PropertyChanged?别客气,在你的问题里看到了。

        2
  •  0
  •   Julian Dominguez    14 年前

    如果InvalidateQuerySuggested不起作用,您可能希望转到一个更简单的路径,只需删除CanExecute约束,而在条形码值为空时直接禁用按钮。

    顺便问一下,你是在使用Prism的DelegateCommand吗?如果是这样,那么InvalidateRequerySuggested根本不被它使用,而是在命令中使用名为RaiseCanExecuteChanged的方法来触发UI上的更新。这将从图片中删除WPF的可视树,以避免降低性能,前提是您拥有响应viewmodel中CanExecute请求的所有信息。