【发布时间】:2014-08-02 20:52:50
【问题描述】:
我在视图模型中定义了以下代码。我认为 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;
}
}
谢谢!
编辑:经过一些试验,异步方法本身似乎可以正常工作。并且无论 async/await 是否包含在 lambda 中,或者该方法是否定义为 async Task 或 async void,都没有区别。
但是,不能正常工作的是canExecute 谓词功能,它会自动启用/禁用与命令的控件绑定。发生的情况是该按钮在异步方法运行时被正确禁用,但之后未启用。我必须单击一次窗口上的某个位置,然后再次启用它。
因此,完整功能似乎需要 RelayCommand 的异步版本,即canExecute 可以正确执行它的操作。
【问题讨论】:
-
IsBusy 是否实现 iNotifyPropertyChanged err 你的 vm 会做吗?属性是否会调用你的方法来调用事件?还是dp?在这种情况下,您必须在 UI 线程上更改它。只是处理这个是一个典型的错误。
标签: c# .net asynchronous async-await relaycommand