【问题标题】:Is it possible to have CommandManager requery only specific WPF command instead of all?是否可以让 CommandManager 仅重新查询特定的 WPF 命令而不是全部?
【发布时间】:2010-03-23 10:18:29
【问题描述】:

我正在尝试为我的 MVVM 应用程序实现高度响应的 UI,因此我选择让所有命令处理程序在 BackgroundWorker 中自动执行,这样它们就不会阻塞 UI。

但同时,我不希望用户能够在后台执行相同的命令时执行它。解决方案似乎很明显:

  1. 当调用Executed 处理程序时,让CanExecute 处理程序返回false
  2. 启动BackgroundWorker async
  3. BackgroundWorker 完成时,让CanExecute 处理程序再次返回true

问题是,我需要在第 1 步之后和第 3 步之后通知 WPF CanExecute 已更改并且应该是必需的。我知道我可以通过调用CommandManager.InvalidateRequerySuggested 来做到这一点,但这会导致所有其他命令的CanExecute 处理程序也被重新查询。有很多命令,那不好。

有没有办法要求重新查询特定命令 - 即当前正在执行的命令?

TIA

【问题讨论】:

    标签: wpf mvvm user-interface routed-commands


    【解决方案1】:

    我认为这两种情况你只需要引发ICommand.CanExecuteChanged事件,相应的控件应该更新它的IsEnabled状态。

    【讨论】:

      【解决方案2】:

      gehho 是对的,只需引发 CanExecuteChanged 事件。但老实说,我不知道你的实现,但如果你的 CanExecute 谓词很简单,我认为很难注意到 wpf 正在重新查询。我不敢相信你会注意到性能下降。你测试过性能吗?我的意思是,假设您在 ViewModel 中有 20 个 ICommand(这可能太多了),如果 ICommand.CanExecute 指向一个布尔字段,您根据 backgroundworker 将其设置为 true 和 false,则它应该花费不到纳秒的时间。但是如果 CanExecute 指向一个评估的方法,那么它可能会更长,但我仍然怀疑它是否会引起注意。

      但是,嘿,我不知道你的实现。

      【讨论】:

        【解决方案3】:

        使用MVVM Helper's `DelegatingCommand' 公开命令的 RaiseCanExecuteChanged()。

        因此,您可以在 BackgroundWorker 上订阅 RunWorkercompleted 事件,并根据记录的工作类型(也许您可以作为结果的一部分返回),您可以从 ViewModel 调用 Command.RaiseCanExecuteChanged()

        【讨论】:

          猜你喜欢
          • 2012-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-21
          • 1970-01-01
          • 1970-01-01
          • 2018-02-14
          相关资源
          最近更新 更多