代码之家  ›  专栏  ›  技术社区  ›  Ian Vink

Xamarin.表格其他任务运行时数据绑定更新

  •  2
  • Ian Vink  · 技术社区  · 6 年前

    在我的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 回复  |  直到 6 年前
        1
  •  1
  •   Diego Rafael Souza    6 年前

    这似乎是你项目中的一个常见需求。我想你可以得到同样的结果与一些更可重用。。。

    也许你应该试试这个:

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

    因此,这三个呼吁将“并行”。

        2
  •  0
  •   Ian Vink    6 年前

    我发现,通过让每一个都有自己的等待进入到自己的功能中,这使得它工作起来:

    await GetAAndUpdateUI();
    await GetBAndUpdateUI();
    await GetCAndUpdateUI();
    
        3
  •  0
  •   LeRoy    6 年前

    也可以使用ConfigureAwait

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