Wpf CommandManager.RequerySuggested是如何工作的?
MSDN只声明 当CommandManager检测到可能改变命令执行能力的条件时发生 然而,我似乎找不到这是如何工作的任何痕迹,我应该注意/避免什么等等。。。Wpf CommandManager.RequerySuggested是如何工作的?,wpf,user-interface,input,keyboard,mouse,Wpf,User Interface,Input,Keyboard,Mouse,MSDN只声明 当CommandManager检测到可能改变命令执行能力的条件时发生 然而,我似乎找不到这是如何工作的任何痕迹,我应该注意/避免什么等等。。。 它只是在听输入吗?(即:鼠标移动、按键等)我无法确切地告诉您,CommandManager监听哪些事件。但是,我可以告诉您,在使用CommandManager进行异步操作时,应该小心。在我的ICommand实现中使用CommandManager时,我遇到了以下问题: 我将一个按钮绑定到一个ICommand,它触发了一个异步操作,该操作增加
它只是在听输入吗?(即:鼠标移动、按键等)我无法确切地告诉您,
CommandManager
监听哪些事件。但是,我可以告诉您,在使用CommandManager
进行异步操作时,应该小心。在我的ICommand
实现中使用CommandManager
时,我遇到了以下问题:
我将一个按钮绑定到一个ICommand
,它触发了一个异步操作,该操作增加了一个值。现在,如果值已达到某个限制,则应禁用按钮/ICommand
(即其CanExecute()
方法应返回false
)。问题是:单击按钮并启动异步操作后,CommandManager
立即调用了myCanExecute()
方法。此异步操作不需要很长时间,但它足够长,可以在CommandManager
检查后获得结果,因此CanExecute()
中的限制检查是使用旧值完成的。因此,尽管实际达到限制,按钮仍保持启用状态。有趣的是,在您单击UI中的任何位置后,该按钮现在被禁用,因为命令管理器
再次检查了ICommand
,现在根据限制检查了新值。
实际上,我认为,CommandManager
在按钮点击后等待了大约50毫秒,直到它执行了对ICommand
的检查,但我对此不太确定
我的解决方案是在我收到异步操作的结果后立即调用ViewModel中的方法,强制
命令管理器
再次检查ICommand
。更新:请注意,必须在UI线程上调用此方法,否则将无效!(感谢midspace的评论)在这种情况下,.NET参考源就是您的朋友。虽然评论很差,但你仍然可以对内部处理有一些想法
在内部类中,您可以找到调用InvalidateRequestSuggested的方法PostProcessInput。此方法的名称允许假定在每个输入事件上调用InvalidateRequestySuggested方法。我确信还有进一步的处理和筛选,因此实际上不会在每次调用InvalidateRequestSuggested时调用CanExecute方法。应该注意,由于您正在运行异步调用,因此必须在UI线程中调用CommandManager.InvalidateRequestSuggested(),否则根据个人经验,在我看来,在这种情况下,您不应该使用CommandManager.RequerySuggestized作为CanExecuteChanged事件的唯一触发器。显然,您的代码知道异步操作何时完成。它应该使用该完成来提升命令的CanExecuteChanged。可能CommandManager.RequerySuggested也有很好的想法,因此您可能还应该使用这些想法。URL已更改为(我无法提交编辑,因为它包含的字符少于6个)。@MikeRosoft我做了更改。