将数据从JSON绑定到ListView(Xamarin.Forms跨平台C#)

时间:2017-08-02 09:01:28

标签: c# json listview xamarin

目前我仍然坚持如何将JSON数据传递给列表视图。

背景信息:软件将定期创建一个json文件,该文件可通过Web服务获得(如下所示)。该数据应解析为列表视图,用户可以在其中查看进程。

JSON在以下示例中看起来像(最多可包含30个进程)

{
  "file_timestamp”: "00:00:00 AM",
  "process": [{
      "id": "1",
      "fzg_nr": "0123",
      "fzg_kz": "KHSKDNJK",
      "timestamp": "03:53:25 AM"
    },
    {
      "id": "2",
      "fzg_nr": "0124",
      "fzg_kz": "UFJSDK",
      "timestamp": "04:53:25 AM"
    },
    {
      "id": "3",
      "fzg_nr": "0125",
      "fzg_kz": "KDFJKLD",
      "timestamp": "05:53:25 AM"
    }
  ]
}

这是我的C#代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace dfg
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class JsonParsingPage : ContentPage
    {
        public JsonParsingPage()
        {
            InitializeComponent();
            GetJSON();
        }

        public async void GetJSON()
        {
            try
            {
                var client = new System.Net.Http.HttpClient();
                var response = await client.GetAsync("http://myinternaliis/xample.JSON");
                string json = await response.Content.ReadAsStringAsync();
                RootObject rootObject = new RootObject();
                ListView listViewJson = new ListView();
                if (json != "")
                {
                    rootObject = JsonConvert.DeserializeObject<RootObject>(json);
                }
                listViewJson.ItemsSource = rootObject.processes;
                Content = listViewJson;
            }
            catch (InvalidCastException e)
            {
                throw e;
            }
            ProgressLoader.IsVisible = false;
        }

        public class Process
        {
            public string id { get; set; }
            public string fzg_nr { get; set; }
            public string fzg_kz { get; set; }
            public string timestamp { get; set; }
        }

        public class RootObject
        {
           public string file_timestamp { get; set; }
           public List<Process> processes { get; set; }
        }
    }
}

XAML文件只包含progressloader。

我真的很感激任何帮助,tipps或参考。提前谢谢,保罗

编辑:我的问题是,数据没有显示在列表视图中......

http://imgur.com/a/c47vW

2 个答案:

答案 0 :(得分:1)

我认为问题是因为您的ListView没有定义ItemTemplate,所以它不知道必须显示哪些信息。

链接的屏幕截图正好说明了这一点 - 您可以查看ListView中的“行”,但无法查看此行的任何数据。

您可以使用基本的DataTemplate来显示已解析的JSON对象的一些属性,如下所示:

DataTemplate template = new DataTemplate(typeof(TextCell));
template.SetBinding(TextCell.TextProperty, "id");
template.SetBinding(TextCell.DetailProperty, "fzg_kz");

listViewJson.ItemTemplate = template;

答案 1 :(得分:0)

感谢目前为止的回复。感谢你们,我可以使用这个问题!

问题在于:

首先,@ Mario C Simao Jr是对的。我不得不将数据绑定到单元格,我就像他建议的那样做。方法改为:

public async void GetJSON()
        {
            try
            {
                var client = new System.Net.Http.HttpClient();
                var response = await client.GetAsync("http://x.x.x.x/xample.JSON");
                string json = await response.Content.ReadAsStringAsync();
                RootObject rootObject = new RootObject();
                ListView listViewJson = new ListView();
                if (json != "")
                {
                    rootObject = JsonConvert.DeserializeObject<RootObject>(json);
                }
                DataTemplate template = new DataTemplate(typeof(TextCell));
                template.SetBinding(TextCell.TextProperty, "id");
                template.SetBinding(TextCell.DetailProperty, "fzg_kz");
                listViewJson.ItemTemplate = template;
                listViewJson.ItemsSource = rootObject.process;
                Content = listViewJson;
            }
            catch (InvalidCastException e)
            {
                throw e;
            }
            ProgressLoader.IsVisible = false;
        }

但所有问题的根源是public class RootObject。 我不得不改变它:

public class RootObject
        {
           public string file_timestamp { get; set; }
           public List<Process> process { get; set; }
        }

所以这是我自己经典的第8层错误。

非常感谢你的帮助!

真诚地,保罗