代码之家  ›  专栏  ›  技术社区  ›  Andrei Rînea

commandmanager.requerysugged是如何工作的?

  •  36
  • Andrei Rînea  · 技术社区  · 15 年前

    MSDN只声明

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

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

    2 回复  |  直到 6 年前
        1
  •  46
  •   Hakan Fıstık MuriloKunze    6 年前

    我不能确切地告诉你 CommandManager 倾听。但是,我可以告诉你你应该 使用时请小心 命令管理器 与异步操作相关 . 当我使用 命令管理器 在我的 ICommand 实施:

    我把一个纽扣绑在 指令 它触发了一个异步操作,增加了一个值。现在,按钮/ 指令 应禁用(即 CanExecute() 方法应返回 false )如果这个值达到了某个极限。问题是: 命令管理器 打电话给我 CanExecute() 方法在单击按钮并启动异步操作之后。这个异步操作不需要很长时间,但它足够长,可以得到它的结果 之后 这个 命令管理器 的支票,以便限额登记 CanExecute() 使用旧值完成。因此,尽管实际已达到限制,但按钮仍保持启用状态。有趣的是,当你点击了用户界面中的任何地方之后,这个按钮就被禁用了,因为 命令管理器 检查了 指令 一次又一次地检查新值是否符合限制。 实际上,我认为 命令管理器 按钮点击后大约等待50毫秒,直到它执行 指令 ,但我不太确定。

    我的解决办法是强迫 命令管理器 检查 指令 再次通过调用 CommandManager.InvalidateRequerySuggested 方法,在我收到异步操作的结果之后。
    更新: 请注意,此方法必须在ui线程上调用,否则将无效! (感谢Midspace的评论)

        2
  •  4
  •   Sam    11 年前

    在这种情况下.NET引用源是您的朋友。尽管它的评论很糟糕,但你仍然可以得到一些关于内部处理的想法。

    在内部 CommandDevice 类找到一个方法postprocessinput,该方法调用invalidaterequerysuggested。此方法的名称允许假设在每个输入事件上调用invalidateRequerySuggested方法。我确信会有进一步的处理和过滤,这样您的canExecute方法实际上不会在每次调用invalidateRequerySuggested时都被调用。