将来自JSON文件的数据放入listview并将它们绑定到xaml中的网格

时间:2017-08-05 19:16:25

标签: c# json xaml listview xamarin

我有一个DetailPage我放了一个ContenView。在这个ContenView中,我实现了一个Grid,因为我想为JSON-ListView提供类似Refresh-Button的内容。到目前为止,这非常有效。

在您的帮助下,我已完成解析JSON数据并将其放入ListView。我的计划是将此ListView放在我的第一个Grid的第二行。我在第一个Grid中做了另一个Grid,我试图将ListView推入内部,但字段是空的......

屏幕截图:http://imgur.com/a/Tj0kd

这是我在DetailPage中的XAML代码

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="ODC_Foto_ConWin_v1.YardList"
             xmlns:local="clr-namespace:ODC_Foto_ConWin_v1"
             Title="YardList"
             BackgroundColor="LightGray">

    <ContentPage.Content>
        <Grid BackgroundColor="#004d93">
            <Grid.RowDefinitions>
                <RowDefinition Height="30"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <Label Grid.Column="0" Grid.Row="0" Text="File-Age: &lt; 12m" FontSize="Small" Margin="5,5,0,0" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" HorizontalOptions="Start" VerticalOptions="Center" TextColor="White" FontAttributes="Bold"/>
            <Image Source="sync.png" Grid.Column="1" Grid.Row="0" Scale="0.7" HorizontalOptions="End" VerticalOptions="Center" Margin="0,5,0,0"/>
            <Label Grid.Column="2"  Grid.Row="0" Text="Sync" FontSize="Small" HorizontalTextAlignment="Center" VerticalTextAlignment="Center" HorizontalOptions="End" VerticalOptions="Center" TextColor="White" Margin="0,5,5,0" FontAttributes="Bold"/>
            <Button Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="2" BackgroundColor="Transparent" VerticalOptions="Center" Clicked="yardListSyncButton_Clicked"/>
            <Grid Grid.ColumnSpan="3" Grid.Row="1">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <ListView x:Name="listViewJson">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <Label Grid.Column="0" Text="{Binding id}" BackgroundColor="Transparent" />
                                <Label Grid.Column="1" Text="{Binding kfz_nr}" BackgroundColor="Transparent" />
                                <Label Grid.Column="2" Text="{Binding kfz_kz}" BackgroundColor="Transparent" />
                                <Label Grid.Column="3" Text="{Binding timestamp}" BackgroundColor="Transparent" />
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </Grid>
            <ActivityIndicator x:Name="ProgressLoader" IsVisible="True" IsRunning="True"/>
        </Grid>
    </ContentPage.Content>
    <ContentPage.ToolbarItems>
        <ToolbarItem Icon="add.png" Activated="ToolbarItem_Activated"/>
    </ContentPage.ToolbarItems>
</ContentPage>

这是我的C#代码:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

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

        private void yardListSyncButton_Clicked(object sender, EventArgs e)
        {
            GetJSON();
        }

        private void ToolbarItem_Activated(object sender, EventArgs e)
        {
            // code for manual process
        }

        public async void GetJSON()
        {
            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);
            }
            listViewJson.ItemsSource = rootObject.process;
            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> process { get; set; }
        }
    }
}

这是关于错误的DataBinding吗?我是在错误的位置启动ItemSource吗?!因为当我在GetJSON()方法中设置datatemplate时,数据是可见的...... 到目前为止,我尝试了一些例子,但在某些时候肯定会有一点错误。我是新编程(我通常是一个系统管理员),所以我不知道从哪里开始寻找错误。

非常感谢任何帮助。

提前致谢, 保罗

1 个答案:

答案 0 :(得分:0)

简短回答:不要创建新列表,使用现有列表 - 只需从GetJSON中删除ListView listViewJson = new ListView();即可。

答案很长

在你的XAML中你有:

<ListView x:Name="listViewJson">

在您的GetJSON方法中,您正在创建 ListView并设置ItemSource,如下所示:

public async void GetJSON()
{
    ListView listViewJson = new ListView();
    (...)
    listViewJson.ItemsSource = rootObject.process;       
}

所以你有2个ListViews,一个在XAML中,一个在GetJSON方法中。 XAML中的ListView与GetJSON方法(listViewJson)中的ListView具有相同的名称。因为在方法中创建的ListView在行listViewJson.ItemsSource = rootObject.process中“更接近”,然后在XAML中创建ListView,所以您要设置新创建的ListView的ItemSource,该ItemSource未添加到您的ContentView中。

编辑: 我在你的代码中看到了其他一些小问题,与问题没有关系,但是因为你正在学习,我觉得值得指出:

  • ListView模板中的标签没有网格作为直接父级,因此Grid.Column="0"没有任何效果

    <ListView.ItemTemplate>
         <DataTemplate>
              <ViewCell>
                   <Label Grid.Column="0">
    
  • 在C#中,对属性使用PascalCase命名样式是一种常见做法。我认为你这样做了:public string timestamp { get; set; }因为json格式。您可以使用JsonPropertyAttribute设置C#和json之间的映射,如下所示:

    [JsonProperty("timestamp")]
    public string Timestamp { get; set; }
    
  • 您隐藏在ProgressLoader末尾的GetJSON,但您没有在开头显示它,因此仅在您GetJSON的{​​{1}}来电时才能看到它(所以构造函数)。

  • 现在你正在使用代码,当你开始使用Xamarin时它完全没问题。稍后我建议你去看看MVVM模式。