如何绑定选择器异步?

时间:2019-08-07 07:17:54

标签: c# xamarin async-await

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

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

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>

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

1 个答案:

答案 0 :(得分:1)

这应该很简单:

  1. 确保设置了Dog<String> extending Pet<dynamic> 属性后触发dynamic事件
  2. 确保在UI线程上触发了此事件

因此,假设您对PropertyChanged的声明如下:

Trades

您可以打电话。在Trades

中分配后,立即public ObservableCollection<Trade> Trades { get; private set; } (或ViewModel类型中的等效项)

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

RaisePropertyChanged("Trades");

或者我个人更希望从头开始就简单地初始化ObservableCollection,然后在GetTradesData()中简单地添加项目:

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

GetTradesData()中的

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