MVVM中的异步命令执行

Gor*_*ran 6 mvvm mvvm-light

我想知道为什么MVVM光缺少命令与异步执行?我相信在很多情况下这可能会有用,所以让我说一个.

假设我们的UI包含一个包含多个屏幕的容器.用户可以关闭特定屏幕或具有多个屏幕的容器.假设用户已在容器上发出了关闭命令.返回的容器在每个屏幕上调用close命令,它需要等待屏幕关闭.实际上,这可能意味着验证数据.因此,我们需要发出异步调用以防止UI变得无响应,我们还需要等待任务完成,才能继续.

所以,如果我们在Command中有这样的东西

public RelayCommand CloseCommand
{
    get { return _closeCommand ?? _closeCommand = new RelayCommand( async () =>
    {
        foreach (var screen in Screens)
        {
            if (!await screen.CloseCommand.ExecuteAsync(null))
            {
                // do something
            }
        }
    }) }

}
Run Code Online (Sandbox Code Playgroud)

我们还可以在屏幕上公开其他方法,但在我看来它应该是RelayCommand的任务,因为它已经存在于那里.

或者有一种不同的方法来处理这种情况?

Ste*_*ary 5

可能是因为有很多不同的方法;我在有关该主题的 MSDN 文章中描述了一些方法。

异步生命周期命令尤其棘手。必须仔细考虑诸如“关闭”命令之类的命令。是否有迹象表明关闭正在进行中?如果用户多次关闭(特别是“关闭”通常可以由操作系统或另一个应用程序启动,即使“关闭按钮”被禁用),会发生什么?