在具有MVVM模式的UserControl WPF中异步加载



在使用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));
    }
}

最新更新