Правильный способ для представления, чтобы дождаться асинхронной операции в ViewModel, это поместить вызов асинхронной операции в метод ViewModel, который помечен как асинхронный, и вернуть Task:
public async Task LoadDataAsync(dbo_registro_dado registro)
{
var contentsPessoa = await App.DadosRepo.GetAllDadosPessoaAsync();
DadosPessoa.Clear();
foreach (var d in contentsPessoa)
{
DadosPessoa.Add(d.nomePessoa);
}
Dado = registro;
}
затем из View вызывать асинхронный метод, ожидающий его:
await vm.LoadDataAsync(registro);
где vm
- ссылка на вашу ViewModel, registro
аргумент, который вам нужно передать.
Если вы не создаете экземпляр ViewModel самостоятельно (например, используете инъекцию зависимостей) или создаете его экземпляр в конструкторе вашего View (где вы не можете использовать ключевое слово await), то вы можете переопределить метод OnBindingContextChanged, например, так: :
protected override async void OnBindingContextChanged()
{
if (BindingContext is YourViewModel vm) {
await vm.LoadDataAsync();
}
base.OnBindingContextChanged();
}
Честно говоря, я сомневаюсь, что опубликованный вами код может скомпилироваться, потому что вы пытаетесь дождаться асинхронной операции в методе, который не помечен как асинхронный. Кроме того, если AddDadosViewModel
является конструктором вашей ViewModel, вы не можете пометить его как асинхронный, потому что вы не можете пометить конструктор как асинхронный.
В любом случае, попробуйте реализовать шаблон, который я объяснил здесь, он должен работать.