Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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
是否可以让CommandManager只重新查询特定的WPF命令而不是全部?_Wpf_Mvvm_User Interface_Routed Commands - Fatal编程技术网

是否可以让CommandManager只重新查询特定的WPF命令而不是全部?

是否可以让CommandManager只重新查询特定的WPF命令而不是全部?,wpf,mvvm,user-interface,routed-commands,Wpf,Mvvm,User Interface,Routed Commands,我试图为我的MVVM应用程序实现一个高响应的UI,因此我选择让所有命令处理程序在BackgroundWorker中自动执行,这样它们就不会阻塞UI 但同时,我不希望用户能够在后台执行相同的命令。解决方案似乎显而易见: 调用执行的处理程序时,让CanExecute处理程序返回false 启动BackgroundWorkerasync 当BackgroundWorker完成时,让CanExecute处理程序再次返回true 问题是,我需要在步骤1之后和步骤3之后再次通知WPF,CanExecute已

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

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

  • 调用执行的
    处理程序时,让
    CanExecute
    处理程序返回
    false
  • 启动
    BackgroundWorker
    async
  • BackgroundWorker
    完成时,让
    CanExecute
    处理程序再次返回
    true
  • 问题是,我需要在步骤1之后和步骤3之后再次通知WPF,
    CanExecute
    已更改,并且应该需要它。我知道我可以通过调用
    CommandManager.InvalidateRequerySuggested
    来实现这一点,但这会导致
    CanExecute
    所有其他命令的处理程序也被重新查询。有很多命令,这不好

    是否有办法要求重新查询特定命令,即当前正在执行的命令


    TIA

    我认为您只需要针对这两种情况引发事件,相应的控件应该更新其
    IsEnabled
    状态。

    gehho是正确的,只需引发CanExecuteChanged事件。但老实说,我不知道您的实现,但如果您的CanExecute谓词很简单,我想很难注意到wpf正在重新查询。我真不敢相信你会注意到演出的热播。您测试过性能吗?我的意思是,假设一个ViewModel中有20个ICommand(这可能太多了),如果ICommand.CanExecute指向一个布尔字段,并且您根据backgroundworker将该字段设置为true和false,则所需时间应少于纳秒。但是如果CanExecute指向一个进行计算的方法,那么它可能会更长,但我仍然怀疑它是否值得注意

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

    使用'DelegatingCommand',它为命令公开了raisecancecutechanged()

    因此,您可以订阅BackgroundWorker上的RunWorkercompleted事件,并根据记录的工作类型(可能您可以作为结果的一部分返回)从ViewModel调用
    命令。RaiseCanceChanged()