选择器不选择Xamarin

时间:2018-08-30 20:27:36

标签: xamarin xamarin.forms cross-platform mvvmcross picker

我使用的是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 :(得分:0)

View等待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调用async方法,等待它:

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的构造函数,则yon无法将其标记为异步,因为您不能将构造函数标记为异步。

无论如何,尝试实现我在此说明的模式,它应该可以工作。