ICommand.CanExecute async

时间:2011-11-16 09:40:08

标签: c# wpf asynchronous command

我有一个命令,检查CanExecute需要很长时间。现在,我问我,是否可以运行CanExecute异步方法?

4 个答案:

答案 0 :(得分:6)

嗯,这是可能的。您应该使用CanExecutedChanged。在后台进行长时间检查(可以使用BackgroundWorker),如果可以执行,则存储结果,触发事件并返回CanExecute中的缓存值。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

CanExecute必须在GUI线程上运行。

但你可以自己实现这个:

使用从Thread更新的Boolean属性。设置后,还要调用NotifyPropertyChanged(对于Command)。

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

答案 3 :(得分:-1)

使用ICommand实现,检查CanExecute是纯粹的可选,使用CanExecute的唯一真正好处是绑定到命令的某些UI控件可以监听CanExecuteChanged事件并启用/禁用它们自己。您可以通过多种方式实现这一目标。

您不必仅仅为了遵守惯例而使用CanExecute。为什么不能在一个单独的线程中启动长期破坏验证以避免UI挂起并在最后执行操作?

相关问题