如何从Web API到Xamarin表单选择器获取数据?

问题描述

我正在开发Xamarin APP,并且希望使用具有服务器数据库的Web API的数据加载Picker。我尝试使用Google进行此操作,但大多数文章并未显示使用Get async Method,Model类和viewmodel的源“服务类”的内容。如果有人可以帮我举一个例子,我将不胜感激。

这是我在ASP.NET Web API中的控制器

// GET: api/TipoUsers
public IQueryable<TipoUser> GetTipoUsers()
{
    return db.TipoUsers;
}

模型类

public class TipoUsuario
{
    public int IdTipoUsuario { get; set; }
    public string Nome { get; set; }
}

viewmodel类

public class Usuarioviewmodel
{
    public ObservableCollection<TipoUsuario> tipos { get; set; }

    public Usuarioviewmodel() {    
        Task<List<TipoUsuario>> task = ApiService.ObterTipoUsuarios();

        tipos = new ObservableCollection<TipoUsuario>(task.Result);    
    }
}

Xaml页面

<Picker Title="Selecione o Tipo de Usuario"
     ItemsSource="{Binding tipos}"
     ItemdisplayBinding="{Binding Nome}"/>

Xaml.cs

{
    [XamlCompilation(XamlCompilationoptions.Compile)]
    public partial class UsuarioPage : ContentPage
    {
        public UsuarioPage()
        {
            InitializeComponent();
            BindingContext = new Usuarioviewmodel();
        }
    }
}

服务等级

public class ApiService
{
    public const string Url = "http://thisismysite:44342/";
    public static async Task<List<TipoUsuario>> GetTipoUsers()
    {
        try
        {
            HttpClient client = new HttpClient();
            string url = Url + "/api/TipoUsers";
            string response = await client.GetStringAsync(url);
            List<TipoUsuario> tipos = JsonConvert.DeserializeObject<List<TipoUsuario>>(response);
            return tipos;
        }
        catch (Exception)
        {

            throw;
        }
    }
}

当我调试应用程序时,它只是不会加载屏幕。

解决方法

发生这种情况可能有几个原因,我会检查您的异步方法是否引发了您无法看到的异常。异步方法返回一个Task对象,如果内部抛出异常,则在Task.Exception中返回的对象中将可见该异常。

https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/exception-handling-task-parallel-library

当您将ObserableCollection设置为新实例,要在集合中添加或删除集合时,也不会调用属性更改事件。

您要更改:

public UsuarioViewModel() {    
    Task<List<TipoUsuario>> task = ApiService.ObterTipoUsuarios();

    tipos = new ObservableCollection<TipoUsuario>(task.Result);    
}

类似:

public UsuarioViewModel() {    
    Task<List<TipoUsuario>> task = ApiService.ObterTipoUsuarios();

    var temptipos = task.Result;
    foreach(var tipo in temptipos)
    {
        tipos.Add(tipo);
    }
}