如何绑定 Picker 异步?

我通过 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>

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


慕少森
浏览 118回答 1
1回答

精慕HU

这应该是直接的:确保PropertyChanged在设置Trades属性后触发事件确保此事件在 UI 线程上触发因此,如果假设您的声明Trades如下所示:public&nbsp;ObservableCollection<Trade>&nbsp;Trades&nbsp;{&nbsp;get;&nbsp;private&nbsp;set;&nbsp;}你打电话就可以了。RaisePropertyChanged("Trades");(或者 ViewModel 类型中的任何等效项)在分配它之后立即GetTradesData()或者,您可以更改您的财产声明:private ObservableCollection<Trade> _trades;public ObservableCollection<Trade> Trades{&nbsp; &nbsp; get => _trades;&nbsp; &nbsp; set&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; _trades = value;&nbsp; &nbsp; &nbsp; &nbsp; RaisePropertyChanged("Trades");&nbsp; &nbsp; }}或者我个人更喜欢的是,简单地从头开始初始化 ObservableCollection 并简单地将项目添加到其中GetTradesData():public ObservableCollection<Trade> Trades { get; } = new ObservableCollection<Trade>();并在GetTradesData():foreach (var trade in tradeList)&nbsp; &nbsp; Trades.Add(trade);
打开App,查看更多内容
随时随地看视频慕课网APP