如何在Xamarin.Forms

时间:2017-05-23 06:51:10

标签: c# xamarin data-binding xamarin.forms async-await

我使用 BindablePicker 在我的Xamarin.Forms应用中显示一些数据。选择器绑定到ViewModel中的ObservableCollection:

<Picker 
   SelectedIndex="{Binding SelectedObjectIndex, Mode=TwoWay}"
   ItemsSource="{Binding ObjectList}"
/>

通过 Autofac Inversion of Control-Container激活视图后,我使用异步服务加载选择器的数据并将它们添加到选择器的集合中#39;来源:

  public override async Task OnActivating()
    {
        var data = await this.dataService.GetAllObjectsAsync().ConfigureAwait(false);
        this.objects.AddRange(data);
        this.objects.ForEach(f => this.ObjectList.Add(f.attr1 + @" - " + f.attr2));
        this.SelectedObjectIndex= 0;
    }

这在90%的情况下有效,但有时数据无法加载和显示。我认为这是因为异步调用创建的后台线程,所以我试图在UI-Thread上强制更新DataSource:

public override async Task OnActivating()
        {
            var data = await dataService.GetAllObjectsAsync().ConfigureAwait(false);
            this.objects.AddRange(data);

            Device.BeginInvokeOnMainThread(
                () =>
                    {
                        this.objects.ForEach(f => this.ObjectList.Add(f.attr1+ @" - " + f.attr2));
                        this.SelectedObjectIndex = 0;
                    });
        }

此解决方案加载列表,但第一个元素未在选择器中正确显示。

如何填充选择器并以正确的方式显示第一个元素?

1 个答案:

答案 0 :(得分:1)

我一直在查看您的代码,我相信您遇到的问题(对于10%的失败)是因为您在异步调用中使用ConfigureAwait(false)

阅读here它清楚地表明,当您稍后操作UI时使用ConfigureAwait可能会因上下文而导致问题。这就是您被迫使用Device.BeginInvokeOnMainThread来防止崩溃的原因。

因此,删除异步调用中的ConfigureAwait(false)可以解决10%失败的问题。

对于字符串仅显示第一个字符的问题,我无法重现它。我的建议是在进行任何其他转换/连接之前打印出值。

注意:您正在进行的连接也可以这样完成:

this.ObjectList.Add ($"{f.attr1} - {f.attr2}");