2015-11-23 1 views
0

У меня есть небольшой асинхронный загрузчик задач в представлении с шаблоном MVVM WPF. Мне нравится, когда я нажимаю кнопку Read из UserControl View, отправлю команду для просмотра модели, а затем она была загружена перед выполнением, и она исчезла, когда я верну данные. Данные считываются устройством через оптический USB. Все работает, программа работает отлично, просто не может поднять загрузку так асинхронно. Загрузка отображается вместе с возвратом чтения, потому что синхронно. Как я могу сделать асинхронный? Я попробовал это с задачей, но, похоже, он не учитывает код.Загрузка асинхронно в WPF UserControl с шаблоном MVVM

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 
     } 
    } 

Если вам нужна дополнительная информация, сообщите в комментариях, что я добавляю все.

ответ

0

Я хотел бы предложить что-то вроде этого:

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 перед выполнением асинхронной операции, и как только это сделано, установите его обратно в ложь.

Вы можете связать свой контроль в 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)); 
    } 
} 
+0

Это работа, спасибо –

Смежные вопросы