如何正确地将列表返回到 Xamarin ListView?

问题描述

我正在尝试使用 ASP.NET Web API 将列表返回到 Xamarin,并使用 Prism MvvM 框架使用 Xamarin Forms。

我有一个 API,它以 JSON 格式返回一个列表,下面是示例。这通过邮递员正确返回数据(我相信):

        public async Task<List<OpenWorkOrder>> GetopenWorkOrders()
    {
        using (WO db = new WO())
        {

           List<OpenWorkOrder> woLog = await db.OpenWorkOrders
                .OrderBy(x => x.WOID)
                .ToListAsync();
                    
                return woLog;   

        }
    }

以下是 postman 返回的数据示例:

[
    {
        "WOID": "M0000001","AssetNumber": "Item 2","WorkRequested": null,"Active": true,"ID": 1
    },{
        "WOID": "M0000002","AssetNumber": "Item 1","ID": 2
    }
]

我正在努力将它绑定到 Xamarin Forms 中的 ListView。 我想使用一个按钮导航到一个页面,并在该页面上加载列表视图,供用户选择他们正在执行的工单。

这是视图和绑定:

    <StackLayout>
    <Label Text="Test"></Label>
    <ListView ItemsSource="{Binding Openorders}"></ListView>
</StackLayout>

这是我调用数据的 viewmodel:

    private object _openWO;

    public object Openorders
    {
        get { return _openWO; }
        set { SetProperty(ref _openWO,value); }
    }
    private async Task<OpenWorkOrder> OpenWO()
    {
        
        var client = new RestClient("http://apiurl/Maint/api/");
        var request = new RestRequest("GetopenWorkOrders",Method.GET);
        IRestResponse<OpenWorkOrder> response2 = await client.ExecuteAsync<OpenWorkOrder>(request);
        var Openorders = response2.Data;
        return Openorders;
    }


    public async void OnNavigatedTo(INavigationParameters parameters)
    {
        try { await OpenWO();
            Console.WriteLine("Await Called!"); }
        catch (Exception ex)
        {
            await _dialogService.displayAlertAsync("Exception Handled",ex.ToString(),"OK");
        }
    }

当我导航到它时,屏幕打开得很好,我看到它运行 Write Line,我只是不知道为什么我在表单上看不到任何数据。

我在哪里搞砸了?

编辑: 与 Jason 交谈后,这里是一些更新的代码

private List<OpenWorkOrder> _openWO;

public List<OpenWorkOrder> Openorders
{
    get { return _openWO; }
    set { SetProperty(ref _openWO,value); }
}

关于更新的代码

   private async Task<OpenWorkOrder> OpenWO()
    {
        
        var client = new RestClient("apiurl/api/");
        var request = new RestRequest("GetopenWorkOrders",Method.GET);
        IRestResponse<OpenWorkOrder> response2 = await client.ExecuteAsync<OpenWorkOrder>(request);

        if (response2.StatusCode.ToString() == "OK")
        {
            Console.WriteLine("RESPONSE DATA!!!!" +response2.Content+"RESPONSE DATA!!!!");

            var Openorders = response2.Data;
            return Openorders;

        }

        else
        {
            Console.WriteLine("Response status code:      " + response2.StatusCode.ToString());
            return null;
        }
    }

这是 OpenWorkOrder 类:

    public class OpenWorkOrder
{
    public int ID { get; set; }
    public string WOID { get; set; }
    public string AssetNumber { get; set; }
    public string WorkRequested { get; set; }
    public Nullable<bool> Active { get; set; }
}

解决方法

首先您需要修改您的 REST 请求以处理 List<OpenWorkOrder>

// this will return a List,not a single object
private async Task<List<OpenWorkOrder>> OpenWO()
{
    var client = new RestClient("http://apiurl/Maint/api/");
    var request = new RestRequest("GetOpenWorkOrders",Method.GET);
    // get a list here too
    IRestResponse<List<OpenWorkOrder>> response2 = await client.ExecuteAsync<OpenWorkOrder>(request);

    // return a list
    return response2.data;
}

然后在调用方法时,您需要将结果分配给您的属性

OpenOrders = await OpenWO();
Console.WriteLine("Await Called!"); }