我正在通过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>
如果正在运行代码,则选取器始终为空。有什么建议吗? 谢谢。
这应该是直截了当的:
- 确保在设置
Trades
属性后触发PropertyChanged
事件 - 确保在 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);