Windows Phone - 使用Json填充ListBox

时间:2014-08-06 12:51:40

标签: c# json windows-phone isolatedstorage

我有一个Json文件保存在" IsolatedStorage" (json.html)我需要填充一个" ListBox"与#34; FName" (来自Json文件)。

  

下面的Json存储在文件(json.html)中并保存在   IsolatedStorage。该文件将根据需要进行更改(同步   与Web服务器)。所以我需要那些领域作为" FNome"和" FEstado"   收到来自" json.html"。

的信息

我的Json文件:

{"xId":"52","result":{"type":"Basico.Bean.MunicipioClass.TMunicipio","id":1,"fields":{"FRefCount":0,"FId":52,"FNome":"Sumare","FEstado":"SP","FPais":"Brasil"}}}

Json的班级:

        public class Fields
    {
        public int FId { get; set; }
        public string FNome { get; set; }
        public string FEstado { get; set; }
        public string FPais { get; set; }
    }

我的列表框:

 <ListBox x:Name="listBox1" 
             Height="192" Width="456" 
             HorizontalAlignment="Center" 
             VerticalAlignment="Top" 
             BorderThickness="5"
             Padding="5"
             BorderBrush="White"
             FontSize="30"
             HorizontalContentAlignment="Stretch" Foreground="{x:Null}">
                    <ListBox.Background>
                        <SolidColorBrush Color="White" Opacity="0.5"/>
                    </ListBox.Background>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="200"></ColumnDefinition>
                                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                                    <ColumnDefinition Width="Auto"></ColumnDefinition>
                                </Grid.ColumnDefinitions>
                                <TextBlock Text="{Binding FNome}"/>
                                <TextBlock Grid.Column="10" Text="{Binding FEstado}"/>
                            </Grid>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

1 个答案:

答案 0 :(得分:0)

我假设你没有使用MVVM design pattern或其他任何&#34;花哨的&#34;,所以这里(几乎)是你学习的最小工作范例。

首先,右键单击您的项目,选择Manage NuGet Packages并安装Json.NET依赖项。 Json.NET包可以帮助您处理JSON格式的数据。

安装后,这将是您的MainWindow.xaml。在这里,您可以定义在显示每个ListBox项时要使用的ListBox和模板。

<Window x:Class="MyWpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="100"
        Width="420">

    <Grid>
        <!-- Your ListBox, notice the ItemsSource -->
        <ListBox 
             Height="50" 
             Width="400"
             FontSize="30"
             HorizontalContentAlignment="Stretch"
             ItemsSource="{Binding Items}">

            <!-- Template to display each item -->
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>

                        <!-- Bind UI controls to properties you want to display -->
                        <TextBlock Grid.Column="0" Text="{Binding FId}"/>
                        <TextBlock Grid.Column="1" Text="{Binding FPais}"/>
                        <TextBlock Grid.Column="2" Text="{Binding FNome}"/>
                        <TextBlock Grid.Column="3" Text="{Binding FEstado}"/>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>  

你的代码隐藏,即MainWindow.xaml.cs。为清楚起见,json定义为const string。

using System.Windows;
using System.Collections.ObjectModel;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace MyWpfApplication
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = this;

            // Your JSON string
            const string json = 
                "{'xId':'52'," +
                "  'result':{" + 
                "    'type':'Basico.Bean.MunicipioClass.TMunicipio'," +
                "    'id':1," + 
                "    'fields':{" + 
                "      'FRefCount':0," +
                "      'FId':52," + 
                "      'FNome':'Sumare'," + 
                "      'FEstado':'SP'," + 
                "      'FPais':'Brasil'" + 
                "    }" + 
                "  }" + 
                "}";

            // Parse as JObject
            JObject jObj = JObject.Parse(json);

            // Extract what you need, the "fields" property
            JToken jToken = jObj["result"]["fields"];

            // Convert as Fields class instance
            Fields fields = jToken.ToObject<Fields>();

            // Assign to Items property, which is used as ListBox's ItemsSource
            // In real application you'd probably want to have more than one item :)
            Items = new ObservableCollection<Fields>() { fields };
        }

        public ObservableCollection<Fields> Items { get; set; }
    }
}

然后,当然,你也需要Fields课程。你可以&#34;映射&#34;如果属性名称匹配,则自动JSON到C#类。如果要在类属性中使用其他名称,请说明Id而不是FId,则需要使用JsonProperty属性标记属性。例如[JsonProperty(PropetyName = "FId)]

public class Fields
{
    [JsonProperty(PropertyName = "FId")]
    public int FId { get; set; }

    public string FNome { get; set; }
    public string FEstado { get; set; }
    public string FPais { get; set; }
}

运行&#34;应用程序&#34;为您提供以下输出

enter image description here