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

Posted

技术标签:

【中文标题】如何正确地将列表返回到 Xamarin ListView?【英文标题】:How do I properly return a List into a Xamarin ListView? 【发布时间】:2021-06-19 10:35:19 【问题描述】:

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

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

        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",
        "WorkRequested": null,
        "Active": true,
        "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; 

【问题讨论】:

为什么OpenOrdersobject 而不是List&lt;OpenWorkOrder&gt;ListViewItemsSource 必须是 IEnumerable 我还在学习!我更新了 OpenOrders 并将其更改为列表。我可以看到正在控制台中写入的数据,正在写入 response2.Content,但是将 OpenOrders 设置为 response2.Data 似乎列表视图仍然是空白的。 OpenWorkOrder 是单个订单还是集合?听起来您的服务返回多个订单,但您正在反序列化为单个订单对象 是订单的集合。 您能否发布该课程的代码,并更新您的其他代码以反映您所做的更改? 【参考方案1】:

首先你需要修改你的 REST 请求来处理List&lt;OpenWorkOrder&gt;

// 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!"); 

【讨论】:

谢谢!我越来越近了。它现在看起来正在提取条目,但我不确定绑定我返回的值。所以它似乎提取了条目,但在 Xamarin 中,这些值是空白的。如果这是有道理的。我可以将此标记为答案并 PM 你吗? 您尚未为您的 ListView 创建模板。您必须定义每行的外观以及要绑定的值 嘿,杰森,我将你的答案标记为答案!我正在创建 ListView 并为每一行绑定数据。这行得通,但是它似乎最初并没有刷新 UI。随着应用程序在调试中运行,ListView 填充但不显示该绑定,直到我删除并重新添加该绑定。然后此时数据显示。如果这有意义的话。

以上是关于如何正确地将列表返回到 Xamarin ListView?的主要内容,如果未能解决你的问题,请参考以下文章

Django - 如何正确地将列表从模板发送到 AJAX 以查看?

如何正确地将 asp.net 核心模型状态错误反序列化为 xamarin 形式的对象

如何正确地将字符串 id 传递给 Xamarin.Forms 中的 API 控制器

如何正确地将 RealmDB 结果对象映射到 SwiftUI 列表?

如何正确地将值从 pyqt 返回到 JavaScript?

将多个类的数据绑定到单个列表视图/xamarin 表单