嵌套GridView绑定JSON的majors数据时重复显示最后一条如何解决
问题修复方案
错误原因
- 内层GridView的数据源绑定错误,错误绑定了页面全局的
majordatasource,没有绑定每个外层Ujian对象自带的专业列表 - 后台解析JSON时
MajorClass实例化位置错误,所有专业都复用同一个对象实例,导致最终所有条目都显示最后一次赋值的内容 - 解析出的专业数据没有存入对应
Ujian实例的majordatasource,而是全部存入了全局列表
修复步骤
1. 修正XAML内层GridView绑定
把内层GridView的ItemsSource改成绑定当前数据上下文(Ujian实例)的majordatasource属性:
<GridView x:Name="asesmenGridView"> <GridView.ItemTemplate> <DataTemplate> <Grid x:Name="asesmenGrid"> <TextBlock x:Name="judulT" Text="{Binding Title}"/> <GridView x:Name="majorGridView" ItemsSource="{Binding majordatasource}"> <GridView.ItemTemplate> <DataTemplate x:DataType="local:MajorClass"> <Grid> <TextBlock x:Name="kelasT" Text="{x:Bind Major}" /> </Grid> </DataTemplate> </GridView.ItemTemplate> </GridView> </DataTemplate> </GridView.ItemTemplate> </GridView>
2. 修正后台JSON解析逻辑
调整MajorClass实例化位置,将解析出的专业存入对应Ujian实例的专业列表:
public MainPage() { this.InitializeComponent(); this.DataContext = this; } public List<Ujian> ujiandatasource { get; set; } = new List<Ujian>(); // 以下接口请求逻辑放在你的异步方法中 string urlPath = "https://.../choose-exam/2"; var httpClient = new HttpClient(new HttpClientHandler()); httpClient.DefaultRequestHeaders.Add("Authorization", string.Format("Bearer {0}", tkn)); var response = await httpClient.GetAsync(urlPath); string jsonText = await response.Content.ReadAsStringAsync(); try { JsonArray jsonArray = JsonArray.Parse(jsonText); foreach (JsonValue groupValue in jsonArray) { JsonObject groupObject = groupValue.GetObject(); string title = groupObject["title"].GetString(); JsonArray majorArray = groupObject["majors"].GetArray(); Ujian ujian = new Ujian(); ujian.Title = title; foreach (JsonValue majorValue in majorArray) { // 每个专业单独实例化MajorClass对象 MajorClass majorC = new MajorClass(); JsonObject majorObject = majorValue.GetObject(); double majorID = majorObject["major_id"].GetNumber(); string major = majorObject["major"].GetString(); majorC.MajorID = (int)majorID; majorC.Major = major; // 专业数据存入当前Ujian的专属列表 ujian.majordatasource.Add(majorC); } ujiandatasource.Add(ujian); } asesmenGridView.ItemsSource = ujiandatasource; } catch (Exception ex) { // 按需补充异常处理逻辑 }
3. 可选优化Ujian构造函数
带参构造函数补充majordatasource初始化,避免空引用异常:
public Ujian(string title) { Title = title; majordatasource = new ObservableCollection<MajorClass>(); }
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

