首页 > 解决方案 > 如何从 Web API 获取数据到 Xamarin 表单选择器?

问题描述

我正在开发一个 Xamarin 应用程序,我想加载一个带有来自具有服务器数据库的 Web API 的数据的选择器。我试着用谷歌搜索,但大多数文章都没有显示使用 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; }
}

视图模型类

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

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

标签: asp.netsql-serverasp.net-web-apixamarin.formspicker

解决方案


这可能有几个原因,我会检查你的异步方法没有抛出你看不到的异常。异步方法返回一个 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);
    }
}

推荐阅读