Сборщик не выбирает ксамарин - PullRequest
0 голосов
/ 30 августа 2018

У меня есть 3-х экранный сборщик, но давайте сначала рассмотрим один из них, основываясь на видео ниже.

В моем виде модели у меня есть.

public ObservableCollection<string> DadosPessoa { get; }
private dbo_registro_dado _dado;
        public dbo_registro_dado Dado
        {
            get => _dado;
            set => SetProperty(ref _dado, value);
        }
public AddDadosViewModel(dbo_registro_dado registro)
        {
var contentsPessoa = await App.DadosRepo.GetAllDadosPessoaAsync();
            DadosPessoa.Clear();
            foreach (var d in contentsPessoa)
            {
                DadosPessoa.Add(d.nomePessoa);
            }
Dado = registro;
}

На моей странице xaml

 <Label Text="{Binding Dado.pessoa}" ></Label>
<Picker Title="Pessoa" ItemsSource="{Binding DadosPessoa}" SelectedItem="{Binding Dado.pessoa}"  />

Когда я звоню и на экране, в определенное время появляется выбранный, а в определенные моменты не появляется, посмотрите в видео, что я добавил ярлык над сборщиком только для того, чтобы убедиться, какая информация появляется

это будет из-за задержки загрузки данных, что я могу сделать, чтобы решить эту проблему?

помня, что данные, заполняющие сборщик, поступают из внутренней базы sqlite

https://www.youtube.com/watch?v=1OVnc_BMuZ8

1 Ответ

0 голосов
/ 31 августа 2018

Правильный способ для представления, чтобы дождаться асинхронной операции в 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, вы не можете пометить его как асинхронный, потому что вы не можете пометить конструктор как асинхронный.

В любом случае, попробуйте реализовать шаблон, который я объяснил здесь, он должен работать.

...