Обновление привязки данных Xamarin.Forms при выполнении других задач - PullRequest
0 голосов
/ 05 сентября 2018

В моем пользовательском интерфейсе мне нужно получить три набора данных от трех служб, а затем отобразить эти три набора данных на экране. Я хочу, чтобы пользовательский интерфейс обновлялся, как только данные из службы возвращались, но пользовательский интерфейс не обновлялся, пока не возвращались все три службы?

упрощенный

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 голосов
/ 05 сентября 2018

Кажется, это общая потребность в вашем проекте. Я думаю, что вы можете получить те же результаты с чем-то более многократно используемым ...

Может быть, вам стоит попробовать это:

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);
}

В этом примере у меня есть такие методы «Get»:

public async Task<IEnumerable<object>> GetA()
{
    return new List<object>( new [] { (object)null });
}

Таким образом, три вызова будут сделаны «параллельно».

Надеюсь, это поможет.

0 голосов
/ 05 сентября 2018

Вы также можете использовать ConfigureAwait

GetA().ConfigureAwait(false);
GetB().ConfigureAwait(false);
GetC().ConfigureAwait(false);
0 голосов
/ 05 сентября 2018

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

await GetAAndUpdateUI();
await GetBAndUpdateUI();
await GetCAndUpdateUI();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...