Мое приложение использует 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
, чтобы уведомить пользовательский интерфейс об изменении. Но не уверен, что я в правильном направлении.
Да, это сделал трюк, но я думал, что CanExecute каким-то образом можно наблюдать с помощью RelayCommand, и мне просто нужно разложить изменения с помощью 'Set'. – Pablo
Событие CanExecuteChanged от ICommand наблюдается в пользовательском интерфейсе, и после его повышения пользовательский интерфейс будет запрашивать CanExecute, чтобы определить, следует ли включать или отключать кнопку (или что-то связанное с этой командой). –
Я все еще хочу понять, почему он не работает «из коробки». Это очень распространенный шаблон для включения/выключения кнопки в ответ на выполнение команды. 'CanExecuteChanged' поднят' RaiseCanExecuteChanged', это понятно. Но сам 'canExecute' должен соблюдаться для меня, по моему мнению. В верхней части 'RelayCommand' в коде src я вижу следующий комментарий:' ВАЖНО: обратите внимание, что закрытие на данный момент не поддерживается из-за использования WeakActions'. Считаете ли вы, что это связано? – Pablo