Я наткнулся на странный случай, и я застрял на нем.
У меня есть Popup View + ViewModel, который как кнопка внутри.Всплывающее окно получает команду из других представлений для выполнения кнопки.
Теперь я хочу отключить кнопку сразу после нажатия, выполнить команду и затем отключить ее.
Вот чтоУ меня сейчас:
PopupViewModel
public override Task InitializeAsync(object navigationData)
{
PopupModel model = (PopupModel) navigationData;
...
_mainActionCommandToRun = model.MainActionCommand;
...
return base.InitializeAsync(navigationData);
}
private void OnMainActionCommand(object obj)
{
MainActionCommand.CanExecute(false);
_mainActionCommandToRun.Execute(null);
MainActionCommand.CanExecute(true);
}
Некоторые Посмотреть, как используется всплывающее окно
await DialogService.ShowPopupAsync<PopupViewModel>(new PopupModel
{
...
MainActionCommand = new Command(
() =>
{
DoSomeThing();
})
});
Этот случай работаетКак колдовство.Это становится сложным, когда действие, назначенное команде, является асинхронным.
Некоторый просмотр с асинхронным действием
await DialogService.ShowPopupAsync<PopupViewModel>(new PopupModel
{
...
MainActionCommand = new Command(
async () =>
{
await DoSomeThing();
})
});
В этом случае _mainActionCommandToRun.Execute (null)запустит асинхронное действие и перейдет к CanExecute (true).
Я не могу дождаться Execute, потому что это метод void, и завершение его с помощью задачи ничего не решит ...
По сути, у меня есть асинхронный метод, который не знает, что это асинхронный метод.