如何正确地将列表 return 放入 Xamarin ListView?
How do I properly return a List into a Xamarin ListView?
我正在尝试使用 ASP.NET Web API 将列表 return 添加到 Xamarin 中,并使用带有 Prism MvvM Framework 的 Xamarin Forms。
我有一个 API return 列表 JSON 格式,下面是示例。这个 returns 数据通过 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;
}
}
这是在邮递员中 returned 的数据示例:
[
{
"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。
我想使用一个按钮导航到一个页面,并在该页面上加载列表视图,以便用户 select 他们正在执行的工单。
这是视图和绑定:
<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 class:
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!"); }
我正在尝试使用 ASP.NET Web API 将列表 return 添加到 Xamarin 中,并使用带有 Prism MvvM Framework 的 Xamarin Forms。
我有一个 API return 列表 JSON 格式,下面是示例。这个 returns 数据通过 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;
}
}
这是在邮递员中 returned 的数据示例:
[
{
"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。 我想使用一个按钮导航到一个页面,并在该页面上加载列表视图,以便用户 select 他们正在执行的工单。
这是视图和绑定:
<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 class:
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!"); }