我正在跟踪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();
}
}
答案 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
或类似的命令,将命令注册到组中。