MSDN仅说明:
在CommandManager检测到可能更改命令执行能力的条件时发生。
但是我似乎找不到任何关于它如何工作、我应该注意什么/避免什么等方面的线索......它只是监听输入吗?(例如鼠标移动、按键等)
MSDN仅说明:
在CommandManager检测到可能更改命令执行能力的条件时发生。
但是我似乎找不到任何关于它如何工作、我应该注意什么/避免什么等方面的线索......它只是监听输入吗?(例如鼠标移动、按键等)
我无法准确告诉您CommandManager
监听的事件。 但是,我可以告诉您,在与异步操作一起使用CommandManager
时应该< strong>小心。 当我在我的ICommand
实现中使用CommandManager
时,出现了以下问题:
我有一个绑定到ICommand
的按钮,触发异步操作增加一个值。 现在,如果该值达到特定限制,则应禁用按钮/ ICommand
(即其CanExecute()
方法应返回false
)。 问题是: CommandManager
在按钮被点击并启动异步操作后立即调用我的CanExecute()
方法。这个异步操作不需要很长时间,但足以在CommandManager
的检查之后获取其结果,因此在CanExecute()
中进行的限制检查使用的是旧值。 因此,按钮仍然启用,尽管实际上已经达到了限制。 有趣的是,当您单击界面上的任何位置后,按钮现在会被禁用,因为CommandManager
再次检查ICommand
,并且现在将新值与限制进行了比较。
实际上,我认为CommandManager
在按钮单击后等待约50毫秒才执行ICommand
检查,但我不太确定。
我的解决方案是在收到异步操作的结果后立即通过在ViewModel中调用CommandManager.InvalidateRequerySuggested
方法来强制CommandManager
再次检查ICommand
。
更新:请注意,此方法必须在UI线程上调用,否则它将无效! (感谢midspace的评论)