为了账号安全,请及时绑定邮箱和手机立即绑定

如何绑定 Picker 异步?

如何绑定 Picker 异步?

C#
慕少森 2023-08-13 15:42:37
我通过 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 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

这应该是直接的:

  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);


查看完整回答
反对 回复 2023-08-13
  • 1 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信