首页 > 解决方案 > 如何绑定 Picker 异步?

问题描述

我正在通过 httpClient 将一些值加载到列表中。现在我想将此列表绑定到一个选择器。但是 Picker 是空的。

我有一个包含不同项目的“贸易”类,例如标题。

ViewModel (FirmsViewModel) 的代码如下:

 public async Task GetTradesData()
        {
            var tradeList = await App.RestService.GetTradesAsync(true);

            Trades = new ObservableCollection<Trade>(tradeList);
        }

“交易”列表已填满。到目前为止,它似乎正在工作。

在我的 Page.cs 文件中,我有以下代码:

public FirmsPage()
        {
            InitializeComponent();

            viewModel = new FirmsViewModel();
            BindingContext = viewModel;
        }

protected async override void OnAppearing()
        {
            base.OnAppearing();

            await viewModel.GetTradesData();
        }

选择器的 XAML:

 <Picker SelectedIndex="{Binding TradesSelectedIndex, Mode=TwoWay}"
                ItemsSource="{Binding Trades}"
                ItemDisplayBinding="{Binding title}"
                Margin="0,15,0,0"
                Title="Select a Trade">
</Picker>

如果您正在运行代码,则 Picker 始终为空。有什么建议么?谢谢。

标签: c#xamarinasync-await

解决方案


这应该是直截了当的:

  1. 确保在设置属性PropertyChanged后触发事件Trades
  2. 确保在 UI 线程上触发此事件

因此,如果假设您的声明Trades如下所示:

public ObservableCollection<Trade> Trades { get; private set; }

你可以打电话。RaisePropertyChanged("Trades");(或您的 ViewModel 类型中的任何等价物)在分配它之后立即GetTradesData()

或者,您可以更改您的财产声明:

private ObservableCollection<Trade> _trades;
public ObservableCollection<Trade> Trades
{
    get => _trades;
    set
    {
        _trades = value;
        RaisePropertyChanged("Trades");
    }
}

或者我个人更喜欢的是从头开始简单地初始化 ObservableCollection 并简单地将项目添加到其中GetTradesData()

public ObservableCollection<Trade> Trades { get; } = new ObservableCollection<Trade>();

并在GetTradesData()

foreach (var trade in tradeList)
    Trades.Add(trade);

推荐阅读