ICommand.CanExecute async

本文关键字:async CanExecute ICommand | 更新日期: 2023-09-27 18:14:53

我有一个命令,检查CanExecute需要很多时间。现在,我问我,如果有可能运行CanExecute异步方法?

ICommand.CanExecute async

这是可能的。你应该使用CanExecutedChanged。在后台做你的长期检查(你可以使用BackgroundWorker),存储结果,如果你可以执行或不执行,触发事件,只是返回缓存值在你的CanExecute

不能直接异步运行。您也不应该这样做,因为您不知道绑定子系统何时会调用它。

没有什么可以阻止你从那个函数中启动一个后台线程,但说实话,这几乎没有意义。如果你的CanExecute代码需要很长时间才能执行,那么你真的需要重新评估你正在做的事情,这是否意味着重做代码,或者重做UI以消除对CanExecute的依赖。

如果你使用了DelegateCommand从Prism中,您可以强制绑定到命令的任何内容在您选择时重新计算CanExecute。这可以通过调用命令上的RaiseCanExecuteChanged()函数来完成。如果你有一个后台线程在需要时调用它,它应该以你想要的方式运行。

CanExecute必须在GUI线程上运行。

但是你可以简单地为自己实现:

使用从线程更新的布尔属性。当它被设置时,也调用NotifyPropertyChanged(对于命令)。

最好将此属性默认为false,但这取决于您的域逻辑。

与ICommand实现,检查CanExecute是纯粹的可选的,使用CanExecute的唯一真正的好处是,一些UI控件被绑定到命令可以监听CanExecuteChanged事件和启用/禁用自己。有很多方法可以做到这一点。

您不必仅仅为了遵循约定而使用CanExecute。为什么不能在一个单独的线程中开始长时间运行的验证,以避免UI挂起,并在结束时执行操作?