Xamarin.Forms DataBinding更新,而其他任务正在运行

时间:2018-09-04 22:05:07

标签: xamarin xamarin.forms

在我的UI中,我必须从三个服务中获取三组数据,然后在屏幕上显示三组数据。我希望UI能够在服务中的数据返回后立即更新,但是UI直到所有三个服务都返回后才更新?

简体

public async Task Refresh()
{
    var a = await GetA();
    observableCollectionA.AddRange(a); 
    RaisePropertyChanged(nameof(observableCollectionA ));

    var b = await GetB();
    observableCollectionB.AddRange(b); 
    RaisePropertyChanged(nameof(observableCollectionB ));

    var c = await GetC();
    observableCollectionC.AddRange(c); 
    RaisePropertyChanged(nameof(observableCollectionC ));

    //Not until they all come back do I see the changes on the screen
}

3 个答案:

答案 0 :(得分:1)

这似乎是您项目中的常见需求。我想您可以通过更可重用的方式获得相同的结果...

也许您应该尝试一下:

res = df.join(pd.DataFrame(df.pop('values').tolist()))\
        .groupby('grp').sum().reset_index()

print(res)

    grp  0  1  2   3   4
0  test  5  7  9  11  13

在此示例中,我具有以下“获取”方法:

public async Task Refresh()
{
    await Task.WhenAll(
        AddAndNotify(new ObservableCollection<object>(), GetA(), "CollectionA"),
        AddAndNotify(new ObservableCollection<object>(), GetB(), "CollectionB"),
        AddAndNotify(new ObservableCollection<object>(), GetC(), "CollectionC")
    );

    // Then, do something
}

public async Task AddAndNotify<T>(ObservableCollection<T> collection, Task<IEnumerable<object>> getElementsService, string propertyNameToNotifyChanged)
{
    collection.AddRange(await Task.Run(() => getElementsService));
    RaisePropertyChanged(propertyNameToNotifyChanged);
}

因此,这三个调用将“并行”进行。

希望对您有帮助。

答案 1 :(得分:0)

我发现通过在等待时将每个函数移入其自身的功能,可以使其工作:

await GetAAndUpdateUI();
await GetBAndUpdateUI();
await GetCAndUpdateUI();

答案 2 :(得分:0)

您还可以使用ConfigureAwait

GetA().ConfigureAwait(false);
GetB().ConfigureAwait(false);
GetC().ConfigureAwait(false);