我使用 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;
});
}
此解决方案加载列表,但第一个元素未在选择器中正确显示。
如何填充选择器并以正确的方式显示第一个元素?
答案 0 :(得分:1)
我一直在查看您的代码,我相信您遇到的问题(对于10%的失败)是因为您在异步调用中使用ConfigureAwait(false)
。
阅读here它清楚地表明,当您稍后操作UI时使用ConfigureAwait
可能会因上下文而导致问题。这就是您被迫使用Device.BeginInvokeOnMainThread
来防止崩溃的原因。
因此,删除异步调用中的ConfigureAwait(false)
可以解决10%失败的问题。
对于字符串仅显示第一个字符的问题,我无法重现它。我的建议是在进行任何其他转换/连接之前打印出值。
注意:您正在进行的连接也可以这样完成:
this.ObjectList.Add ($"{f.attr1} - {f.attr2}");