c# - 如何绑定 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 始终为空。有什么建议么?谢谢。
解决方案
这应该是直截了当的:
- 确保在设置属性
PropertyChanged
后触发事件Trades
- 确保在 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);
推荐阅读
- node.js - 在 ubuntu、aws ami 上安装特定的 Node.JS 版本
- python - Python删除具有时间条件的行
- javascript - 表过滤器重置vue js
- javascript - 如何在反应中使用下载的字体?
- mongodb - 在 mongodb 中,$or 运算符优先于简单的相等(键:值)?
- php - 关于 mtownsend/request-xml(XML 到数组)插件的问题
- swift - 核心数据,嵌套列表
- java - android 的 PJSIP 库更新
- mysql - 有没有可以找到最高层次结构的查询?(Mysql)
- react-native - React Native 调试器与 VPN 上的设备