Xamarin Forms - Как отобразить данные в привязке (список из HttpClient)? - PullRequest
0 голосов
/ 31 октября 2019

Невозможно отобразить данные в виде списка после десериализации json. Как мне настроить его, чтобы увидеть его?

Я привязываю данные, мой ответ от http-клиента использует контекст привязки, чтобы я мог использовать его в своем представлении списка.

MainPage.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>

MainPage.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 };



        }

DataService.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;
            }
        }
    }

Я не получаю никаких сообщений об ошибках, за исключением этого выходного сообщения "Binding: System.Threading.Tasks.Task`1[System.Collections.Generic.List`1[Test.Models.Bill]] can not be converted to type 'System.Collections.IEnumerable'", которое, по моему мнению, не является проблемой, так как я вижу, что мой список заполняется правильно, когда я отлаживаю.

Можете ли вы помочь мне, пожалуйста?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Метод Нихила - это один из способов, если вы хотите установить список, который запрашивает http-клиент для просмотра списка, вы можете привязать свойство ListView * 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();
    }
}

in 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>
0 голосов
/ 31 октября 2019

Вам нужно изменить метод GetBillsAsync, чтобы получить массив, а затем преобразовать в список с помощью Array.ToList () с System.Linq.

Для этого вам нужно реализовать 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 vm;public MainPage () {

            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}">

Эти изменения должны работать. Дайте мне знать, если у вас возникнут трудности. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...