在使用WPF MVVM模式的视图中,我遇到了一个小问题异步加载程序。我希望当我单击"从用户控制视图读取"按钮时,发送一个命令来查看模型,然后在执行之前它已经停止加载,当我返回数据时它就消失了。数据由机器通过光学USB读取。一切正常,程序运行得很好,只是不能这么异步地加载。加载与读数的返回一起显示,因为是同步的。如何进行异步操作?我在任务中尝试过,但他似乎没有考虑代码。
class ReadAndPrintFromDevice : ICommand
{
async Task<int> showLoader()
{
model.ShowLoader = true;
return 1;
}
public event EventHandler CanExecuteChanged;
public bool CanExecute(object parameter)
{
return true;
}
public async void Execute(object parameter)
{
showLoader async here
//other code..
showloader async shadow here, after other code
}
}
如果你需要更多信息,请在评论中告诉我,我会添加所有信息。
我建议这样做:
public class ReadAndPrintFromDeviceAsyncCommand : PropertyChangedBase, ICommand
{
private bool _IsBusy;
public bool IsBusy
{
get { return _IsBusy; }
private set
{
_IsBusy = value;
NotifyOfPropertyChange();
}
}
public bool CanExecute(object parameter)
{
return !IsBusy;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public async void Execute(object parameter)
{
IsBusy = true;
await ...
IsBusy = false;
}
}
通过使用IsBusy
属性,您可以在执行异步操作之前简单地将其设置为true
,一旦完成,就将其设置回false。
然后,您可以将控件绑定到IsBusy
属性:
<MyControl Visibility="{Binding SomeCommand.IsBusy, ...}"
上面的例子需要一个BooleanToVisibilityConverter
才能工作,但我想你已经明白了。
此外,该命令使用了一个PropertyChangedBase
,我创建它只是为了让实现INotifyPropertyChanged
更容易,这个类的代码如下:
public abstract class PropertyChangedBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyOfPropertyChange([CallerMemberName]string propertyName = null)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}