2016-05-04 3 views
0

Мое приложение использует MVVM Light toolkit. Это команда, которая привязана к кнопке в XAML:Состояние кнопки не обновляется с использованием RelayCommand

private RelayCommand _buttonCommandNew; 
    public RelayCommand ButtonCommandNew 
    { 
     get 
     { 
      var worker = new TCService(); 
      return _buttonCommandNew 
        ?? (_buttonCommandNew = new RelayCommand(async() => 
        { 
         var progress = new Progress<string>(status => 
         { 
          ProgressText = status; 
         }); 

         await worker.GenerateConfiguration(1, "", "", progress); 
        },() => !worker.InProgress 
       )); 
     } 
    } 

Это услуга:

class TCService : ITCService 
{ 
    public Task<bool> GenerateConfiguration(int cellCount, string templateFilePath, string outputFilePath, IProgress<string> progress) 
    { 
     return Task.Run(() => RunConfigurator(progress)); 
    } 

    public bool InProgress { get; private set; } 

    private bool RunConfigurator(IProgress<string> progress) 
    { 
     InProgress = true; 
     Thread.Sleep(6000); 
     progress.Report("Yeah!"); 
     InProgress = false; 
     return true; 
    } 
} 

То, что я хочу добиться того, чтобы кнопка была отключена, когда запуск службы для работы и включите его в конце. Это не происходит с текущей реализацией. Что еще более важно, сделать это с соблюдением MVVM Light. Я чувствую, что моя служба должна быть унаследована от одной из базовых кланов в MVVM Light, и мне нужно использовать Set, чтобы уведомить пользовательский интерфейс об изменении. Но не уверен, что я в правильном направлении.

ответ

0

Вы можете перемещать объект InProgress в модель просмотра (класс, который содержит свойство ButtonCommandNew) и который привязан к интерфейсу.

Затем в инкубаторе в InProgress недвижимости, которую можно назвать ButtonCommandNew.RaiseCanExecuteChanged, которая собирается уведомить, что пользовательский интерфейс для вызова CanExecute на _buttonCommandNewRelayCommand и, следовательно, включить или отключить кнопку в интерфейсе в зависимости от значения InProgress имущество.

В этом случае вам нужно установить InProgress свойство true перед вызовом worker.GenerateConfiguration, а затем сбросить его false после того как вы сделали вызов метода.

+0

Да, это сделал трюк, но я думал, что CanExecute каким-то образом можно наблюдать с помощью RelayCommand, и мне просто нужно разложить изменения с помощью 'Set'. – Pablo

+0

Событие CanExecuteChanged от ICommand наблюдается в пользовательском интерфейсе, и после его повышения пользовательский интерфейс будет запрашивать CanExecute, чтобы определить, следует ли включать или отключать кнопку (или что-то связанное с этой командой). –

+0

Я все еще хочу понять, почему он не работает «из коробки». Это очень распространенный шаблон для включения/выключения кнопки в ответ на выполнение команды. 'CanExecuteChanged' поднят' RaiseCanExecuteChanged', это понятно. Но сам 'canExecute' должен соблюдаться для меня, по моему мнению. В верхней части 'RelayCommand' в коде src я вижу следующий комментарий:' ВАЖНО: обратите внимание, что закрытие на данный момент не поддерживается из-за использования WeakActions'. Считаете ли вы, что это связано? – Pablo