Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf CommandManager.RequerySuggested是如何工作的?_Wpf_User Interface_Input_Keyboard_Mouse - Fatal编程技术网

Wpf CommandManager.RequerySuggested是如何工作的?

Wpf CommandManager.RequerySuggested是如何工作的?,wpf,user-interface,input,keyboard,mouse,Wpf,User Interface,Input,Keyboard,Mouse,MSDN只声明 当CommandManager检测到可能改变命令执行能力的条件时发生 然而,我似乎找不到这是如何工作的任何痕迹,我应该注意/避免什么等等。。。 它只是在听输入吗?(即:鼠标移动、按键等)我无法确切地告诉您,CommandManager监听哪些事件。但是,我可以告诉您,在使用CommandManager进行异步操作时,应该小心。在我的ICommand实现中使用CommandManager时,我遇到了以下问题: 我将一个按钮绑定到一个ICommand,它触发了一个异步操作,该操作增加

MSDN只声明

当CommandManager检测到可能改变命令执行能力的条件时发生

然而,我似乎找不到这是如何工作的任何痕迹,我应该注意/避免什么等等。。。
它只是在听输入吗?(即:鼠标移动、按键等)

我无法确切地告诉您,
CommandManager
监听哪些事件。但是,我可以告诉您,在使用
CommandManager
进行异步操作时,应该小心。在我的
ICommand
实现中使用
CommandManager
时,我遇到了以下问题:

我将一个按钮绑定到一个
ICommand
,它触发了一个异步操作,该操作增加了一个值。现在,如果值已达到某个限制,则应禁用按钮/
ICommand
(即其
CanExecute()
方法应返回
false
)。问题是:单击按钮并启动异步操作后,
CommandManager
立即调用了my
CanExecute()
方法。此异步操作不需要很长时间,但它足够长,可以在
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我做了更改。