我有一个DetailPage
我放了一个ContenView
。在这个ContenView
中,我实现了一个Grid
,因为我想为JSON-ListView提供类似Refresh-Button
的内容。到目前为止,这非常有效。
在您的帮助下,我已完成解析JSON数据并将其放入ListView
。我的计划是将此ListView
放在我的第一个Grid
的第二行。我在第一个Grid
中做了另一个Grid
,我试图将ListView
推入内部,但字段是空的......
这是我在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: < 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时,数据是可见的......
到目前为止,我尝试了一些例子,但在某些时候肯定会有一点错误。我是新编程(我通常是一个系统管理员),所以我不知道从哪里开始寻找错误。
非常感谢任何帮助。
提前致谢, 保罗
答案 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模式。