我在一个视图模型中定义了下面的代码。我认为类型为 Func<Task>
的 SaveAsync 正在被转换为 Action,因为 RelayCommand 需要一个 Action 而不是 Func<Task>
,但我对此的影响不清楚。
1)RelayCommand 是否需要被替换为异步版本(RelayCommandAsync)? 2)当前代码在异步方面到底做了什么? 3)如有必要,我应该改变什么来提高/纠正它?
private ICommand _saveCommand;
public ICommand SaveCommand
{
get { return _saveCommand ?? (_saveCommand = new RelayCommand(async () => await SaveAsync(), CanSave)); }
}
public bool CanSave()
{
return !IsBusy;
}
private async Task SaveAsync()
{
IsBusy = true;
try
{
await _service.SaveAsync(SomeProperty);
}
catch ( ServiceException ex )
{
Message = "Oops. " + ex.ToString();
}
finally
{
IsBusy = false;
}
}
谢谢!
编辑:经过一些尝试,似乎异步方法本身是正常工作的。无论lambda是否包含async/await以及方法是否定义为async Task
或async void
都没有区别。
然而,不能正确工作的是canExecute
谓词功能,它自动启用/禁用与命令绑定的控件。在异步方法运行时,按钮被正确地禁用了,但之后它没有再次启用。我必须在窗口某个地方点击一次,然后它才能再次启用。
因此,似乎需要一个异步版本的RelayCommand才能实现完整的功能,即使得canExecute
可以正确地执行其功能。