如何绑定选取器异步?



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

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

ViewModel (FirmViewModel( 具有以下代码:

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. 确保在设置Trades属性后触发PropertyChanged事件
  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);

最新更新