Xamarin选择器未显示列表中的日期

时间:2020-07-30 04:01:12

标签: c# api arraylist xamarin.forms picker

我有以下代码:

    <ContentPage.BindingContext>
        <local:PisterosViewModel/>
    </ContentPage.BindingContext>

<Picker x:Name="pck_Pisteros"
                        ItemDisplayBinding="{Binding PisteroN}"
                        ItemsSource="{Binding PisterosLista}"
                        SelectedItem="{Binding PisterosLista}"
                        Title="Seleccione el usuario..."/>

然后是我的模特:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics.Contracts;
using System.Text;

namespace ServLottery.Models
{
    public class Pisteros
    {
        public string PisteroID { get; set; }
        public string PisteroN { get; set; }

    }

}

和视图模型:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;

namespace ServLottery.Models
{
    public class PisterosViewModel
    {
        public IList<Pisteros> PisterosLista { get; set; }

        public PisterosViewModel()
        {
            try
            {
                PisterosLista = new ObservableCollection<Pisteros>();
                GetPisteros();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private async void GetPisteros()
        {
            try
            {
                RestClient client = new RestClient();
                var pist = await client.Get<Models.Pisteros>("https://servicentroapi.azurewebsites.net/api/Pisteros");
                if (pist != null)
                {
                    PisterosLista = pist;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

    }
}

我在var pist中设置了一个断点,它确实具有值,然后Pisteros列表似乎也获得了值,并且这在页面加载时执行,所以我不明白出了什么问题,但是选择器从不显示选项。

Breakpoint 1 Breakpoint 2

1 个答案:

答案 0 :(得分:2)

欢迎您!

似乎 Xaml 中的BindingContext无法处理动态数据,例如来自Web服务器的API数据。

有一种解决方法,可以通过在ContentPage中使用编码来动态绑定ItemSource,也可以参考this officail sample

因此,请在 Page.Xaml.cs 中添加代码,如下所示:

protected override async void OnAppearing()
{
    pck_Pisteros.ItemsSource = await GetTasksAsync();
    base.OnAppearing();
}

private async Task<List<Pisteros>> GetTasksAsync()
{
    List<Pisteros> PisterosLista = new List<Pisteros>();
    HttpClient client = new HttpClient();
    Uri uri = new Uri(string.Format("https://servicentroapi.azurewebsites.net/api/Pisteros", string.Empty));
    HttpResponseMessage response = await client.GetAsync(uri);
    if (response.IsSuccessStatusCode)
    {
        string content = await response.Content.ReadAsStringAsync();
        PisterosLista = JsonConvert.DeserializeObject<List<Pisteros>>(content);
        Console.WriteLine("content :: " + content);
        Console.WriteLine("Data :: " + PisterosLista);
    }

    return PisterosLista;
}

现在它将显示:

enter image description here