UWA上的异步UI模式

时间:2016-03-21 14:05:50

标签: wpf asynchronous mvvm async-await win-universal-app

我正在跟踪Stephen关于异步UI的this great article,但不幸的是,这不适用于通用Windows应用程序,因为CommandManager类不可用。

如何解决此限制?

这是异步命令的基本类型:

public abstract class AsyncCommandBase : IAsyncCommand
{
  public abstract bool CanExecute(object parameter);
  public abstract Task ExecuteAsync(object parameter);
  public async void Execute(object parameter)
  {
    await ExecuteAsync(parameter);
  }
  public event EventHandler CanExecuteChanged
 {
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
 }
  protected void RaiseCanExecuteChanged()
 {
CommandManager.InvalidateRequerySuggested();
}
}

1 个答案:

答案 0 :(得分:1)

正如评论中所指出的,不应使用此“模式”,因为当您注册了许多命令时,它会对性能产生影响。

CommandManager.InvalidateRequerySuggested()的任何调用都将强制WPF验证每个注册命令及其CanExecute(...)方法。

相反,只需声明事件并让WPF注册到它

public abstract class AsyncCommandBase : IAsyncCommand
{
    ...
    public event EventHandler CanExecuteChanged;
    public void RaiseCanExecuteChanged()
    {
        // C# 6.0, otherwise assign the handler to variable and do null check
        CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    }
    ...
}

每当您想要使命令无效时,您仍然只使用command.RaiseCanExecuteChanged();。如果要触发多个命令的重新验证,则需要自行管理(即创建CompoundCommand或类似的命令,将命令注册到组中。