Ответ 1
После помощи Уильяма и Хамарина я наконец смог найти, как работает функциональность.
Это бит счетчик интуитивно понятен, так как мы ожидаем, что Enable/Disable кнопка (ToolbarItem), но мы фактически должны управлять состоянием команды, связанной с кнопкой. Как только мы понимаем этот шаблон, это имеет смысл.
Объект Command типа ICommand имеет свойство CanExecute (спасибо, Уильям, указав его) Теперь вы не хотите получать доступ к нему напрямую, если только это не проверяет, может ли команда быть выполнена или нет.
Где бы вы ни находились в вашем коде, чтобы изменить состояние команды, вам нужно добавить следующую строку:
((Command)_myCommand).ChangeCanExecute();
Эта строка приведет к переопределению свойства CanExecute для указанной команды.
Я лично решил добавить его, где я отслеживаю бездействие, поскольку это имеет смысл в моем приложении.
public bool Inactive {
get {
return _inactive;
}
set {
if (_inactive != value) {
_inactive = value;
((Command)_myCommand).ChangeCanExecute();
OnPropertyChanged ();
}
}
}
В представлении изменений не должно быть отмечено:
<ToolbarItem Text="Run" Command="{Binding MyCommand}" />
Теперь при создании объекта Command будет выполняться большая работа. Обычно мы используем конструктор одиночных аргументов, как это обычно бывает, и именно там мы определяем, что делает наша команда. Интересно, что существует и 2 конструктора параметров, где вы можете предоставить функцию/действие, которая определяет значение свойства CanExecute.
_myCommand = new Command (async () => {
Inactive = false;
await Run();
Inactive = true;
},
() => {
return Inactive;
});
public ICommand MyCommand {
get {
return _myCommand;
}
}
Изменить: я знаю, что технически изменение значения Inactive должно происходить в Run(), но для демонстрационных целей...