После помощи Уильяма и Хамарина я наконец смог найти, как работает функциональность.
Это бит счетчик интуитивно понятен, поскольку мы ожидаем включить/отключить кнопку (ToolbarItem), но нам действительно нужно управлять состоянием команды, привязанной к кнопке. Как только мы понимаем эту закономерность, это имеет смысл.
Объект Command типа ICommand имеет свойство CanExecute (спасибо William за указание его) Теперь вы не хотите напрямую обращаться к нему/использовать его, если только он не проверяет, может ли команда быть выполнена или не.
Везде, где вы считаете нужным в своем коде, чтобы изменить состояние команды, вам необходимо добавить следующую строку:
((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;
}
}
Edit: Я знаю, что технически изменив значение Inactive должно произойти в Run(), но для демонстрационных целей ...
Заметь, я попытался заменить «ToolbarItem» с «Button» и с треском провалились: «Тип объекта Xamarin.Forms.Button не может быть преобразован в целевой тип: Xamarin.Forms.ToolbarItem». – LostBalloon
в зависимости от ожидаемой длины вашей операции, если вы запустили ее в потоке пользовательского интерфейса, кнопка остается в нажатом состоянии. это уродливый взломать, и вы не должны использовать его для доступа к сети, поскольку это может заблокировать ваше приложение в течение очень длительного времени. –