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

如何在C# MAUI中用CollectionView显示分组学生考勤数据

修正CollectionView分组展示方案

问题根源

  1. 未启用分组模式:原XAML未设置IsGrouped="True",导致CollectionView将每个AttendanceGroup当作普通列表项处理,而非分组容器,因此ItemTemplate尝试在分组对象上绑定aStudent_Name属性,触发绑定错误。
  2. 分组结构识别问题:直接继承List<Attendance>的分组类,MAUI无法自动识别其作为子项集合的身份,需要明确指定分组内子项的路径。

方案一:规范分组实体类(推荐)

将AttendanceGroup改为组合模式,明确子项集合属性,让CollectionView能清晰识别分组结构:

public class AttendanceGroup
{
    public string GroupName { get; private set; }
    // 存储分组内的考勤记录
    public List<Attendance> Attendees { get; private set; }

    public AttendanceGroup(string name, List<Attendance> attendees)
    {
        GroupName = name;
        Attendees = attendees;
    }
}

对应XAML配置

添加分组开关并指定子项路径:

<CollectionView x:Name="collectionView" IsGrouped="True" GroupMemberPath="Attendees">
    <CollectionView.GroupHeaderTemplate>
        <DataTemplate>
            <Label Text="{Binding GroupName}" FontAttributes="Bold" Margin="0,10,0,5"/>
        </DataTemplate>
    </CollectionView.GroupHeaderTemplate>
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Grid Margin="0,0,0,10" Padding="10" MinimumHeightRequest="60" BackgroundColor="#f0f0f0">
                <Label Text="{Binding aStudent_Name}"/>
                <!-- 可扩展显示更多考勤信息 -->
                <Label Text="{Binding aClass_Description}" FontSize="Small" TextColor="Gray" HorizontalOptions="End"/>
            </Grid>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

方案二:保留原有实体类结构

如果不想修改AttendanceGroup的继承逻辑,只需在XAML中开启分组并指定子项为分组对象自身:

<CollectionView x:Name="collectionView" IsGrouped="True" GroupMemberPath=".">
    <CollectionView.GroupHeaderTemplate>
        <DataTemplate>
            <Label Text="{Binding GroupName}" FontAttributes="Bold" Margin="0,10,0,5"/>
        </DataTemplate>
    </CollectionView.GroupHeaderTemplate>
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Grid Margin="0,0,0,10" Padding="10" MinimumHeightRequest="60" BackgroundColor="#f0f0f0">
                <Label Text="{Binding aStudent_Name}"/>
            </Grid>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

数据源赋值

两种方案的数据源赋值逻辑保持不变:

ObservableCollection<AttendanceGroup> attendanceGroups = DatabaseHelper.GetAttendanceGroupsData(connectionString, selectedDate);
collectionView.ItemsSource = attendanceGroups;

内容的提问来源于stack exchange,提问作者SqueezeOJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 00:12:03