[英]Xamarin Forms - How to display data binded (List from HttpClient)?
json 反序列化后无法在列表视图中显示数据。 我需要如何设置才能看到它?
我正在使用绑定上下文从 http 客户端对我的响应进行数据绑定,因此我可以在我的列表视图中使用它。
主页.xaml
<ContentPage
Title="Home"
>
<Grid>
<ListView ItemsSource="{Binding .}">
<ListView.ItemTemplate>
<DataTemplate>
<StackLayout>
<Label Text="{Binding Description}"/>
<Label Text="{Binding Value}"/>
</StackLayout>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</ContentPage>
主页.cs
public MainPage()
{
DataService ds = new DataService();
BindingContext = ds.GetBillsAsync();
InitializeComponent();
Chart1.Chart = new BarChart { Entries = entries, LabelTextSize = (float)Convert.ToDouble(Device.GetNamedSize(NamedSize.Large, typeof(Label))), BackgroundColor = SKColors.Transparent };
}
数据服务.cs
public class DataService
{
HttpClient client = new HttpClient();
public async Task<List<Bill>> GetBillsAsync()
{
try
{
string url = "my url";
var response = await client.GetStringAsync(url).ConfigureAwait(continueOnCapturedContext: false); ;
var bills = JsonConvert.DeserializeObject<List<Bill>>(response);
return bills;
}
catch (Exception e)
{
throw e;
}
}
}
我没有收到任何错误消息,除了此 output 消息"Binding: System.Threading.Tasks.Task`1[System.Collections.Generic.List`1[Test.Models.Bill]] can not be converted to type 'System.Collections.IEnumerable'"
我认为这不是问题,因为我在调试时可以看到我的列表被正确填充。
你能帮我吗?
先感谢您
Nikhil 的方法是一种方法,如果您只想将来自 http 客户端的请求的列表设置到列表视图,您可以绑定到列表视图的ItemsSource属性。
在MainPage.xaml.cs 中:
public partial class MainPage: ContentPage
{
DataService ds = new DataService();
public MainPage()
{
InitializeComponent();
Chart1.Chart = new BarChart { Entries = entries, LabelTextSize = (float)Convert.ToDouble(Device.GetNamedSize(NamedSize.Large, typeof(Label))), BackgroundColor = SKColors.Transparent };
}
protected override async void OnAppearing()
{
base.OnAppearing();
listview.ItemsSource = await ds.GetBillsAsync();
}
}
在MianPage.xaml :
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="Home"
x:Class="App18.MainPage">
<ContentPage.Content>
<StackLayout>
<ListView x:Name="listview">
<ListView.ItemTemplate>
<DataTemplate>
<StackLayout>
<Label Text="{Binding Description}"/>
<Label Text="{Binding Value}"/>
</StackLayout>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage.Content>
</ContentPage>
您需要更改 GetBillsAsync 方法以检索 Array,然后使用 Array.ToList() 和 System.Linq 转换为 List。
您需要为此实现一个 ViewModel。 您可以将 NuGet MVVM 帮助程序用于 BaseViewModel 或实现您自己的。
using System.Windows.Input;
using MvvmHelpers.Interfaces;
namespace NameSpace.ViewModel
{
public partial class HomeViewModel : BaseViewModel
{
private ObservableCollection<Bill> _listOfbills = new ObservableCollection<Bill>();
public ObservableCollection<Bill> ListOfbills
{
get => _listOfbills;
set => SetProperty(ref _listOfbills, value);
}
public HomeViewModel()
{
DataService ds = new DataService();
ListOfbills = ds.GetBillsAsync()
}
}
}
然后您的 MainPage 变为:-
HomeViewModel 虚拟机; 公共主页(){
BindingContext = vm = new HomeViewModel();
InitializeComponent();
Chart1.Chart = new BarChart { Entries = entries, LabelTextSize = (float)Convert.ToDouble(Device.GetNamedSize(NamedSize.Large, typeof(Label))), BackgroundColor = SKColors.Transparent };
}
然后在 Xaml 你可以改变这一行如下: -
<ListView ItemsSource="{Binding ListOfbills}">
这些更改应该有效。 如果您遇到困难,请告诉我。 谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.