GridView嵌套场景下内层GridView数据绑定与名称访问问题咨询
问题原因
这个报错是因为majorGridView定义在asesmenGridView的ItemTemplate内部,属于DataTemplate模板内的控件,不会被注册到页面的全局命名空间中,因此后台代码无法直接通过x:Name访问到该控件。
解决步骤
1. 调整实体类结构
每个外层的考试条目需要自带对应的专业子集合,修改Ujian类如下:
class Ujian { public string Title { get; set; } // 新增子集合属性,存储当前考试对应的所有专业 public ObservableCollection<UjianMajor> Majors { get; set; } = new ObservableCollection<UjianMajor>(); } // 专业实体类,也可直接替换为ObservableCollection<string>简化使用 class UjianMajor { public string Major { get; set; } }
2. 修改XAML绑定逻辑
给嵌套的majorGridView添加ItemsSource绑定,绑定到外层条目自带的Majors属性即可:
<GridView x:Name="asesmenGridView"> <GridView.ItemTemplate> <DataTemplate> <UserControl> <Grid> <StackPanel x:Name="judulStack" Height="40"> <TextBlock x:Name="judulT" Text="{Binding Title}"/> </StackPanel> <!-- 新增ItemsSource绑定,不需要后台访问Name即可完成数据填充 --> <GridView x:Name="majorGridView" ItemsSource="{Binding Majors}"> <GridView.ItemTemplate> <DataTemplate> <UserControl> <Grid> <TextBlock x:Name="kelasT" Text="{Binding Major}"/> </Grid> </UserControl> </DataTemplate> </GridView.ItemTemplate> </GridView> </Grid> </UserControl> </DataTemplate> </GridView.ItemTemplate> </GridView>
3. 调整后台数据处理代码
不需要单独声明全局的专业数据源,将对应专业数据放到对应外层考试条目的子集合中即可:
ObservableCollection<Ujian> ujiandatasource = new ObservableCollection<Ujian>(); string urlPath = "https://pto.study.id/api/" + ((App)(App.Current)).AsesmenCode + "-do/s2/choose-exam/" + guru.ID; 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(); // 初始化外层考试对象 Ujian ujian = new Ujian(); ujian.Title = groupObject["title"].GetString(); JsonArray majorArray = groupObject["majors"].GetArray(); foreach(JsonValue majorValue in majorArray) { JsonObject majorObject = majorValue.GetObject(); string major = majorObject["major"].GetString(); UjianMajor ujianMajor = new UjianMajor(); ujianMajor.Major = major + ", "; // 加入当前考试对应的专业子集合 ujian.Majors.Add(ujianMajor); } ujiandatasource.Add(ujian); } // 仅需给外层GridView赋值一次数据源即可 asesmenGridView.ItemsSource = ujiandatasource; }
实现原理
调整后绑定层级完全匹配:外层asesmenGridView绑定全局考试集合,每个条目对应一个Ujian实例,嵌套的majorGridView自动绑定当前Ujian实例的Majors子集合,子项直接绑定Major属性即可正常显示内容,完全不需要后台访问嵌套GridView的名称。
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

