问题描述
我正在开发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中返回的对象中将可见该异常。
当您将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);
}
}