You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:00:01