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

.NET MAUI中CollectionView能否添加多组数据?如何实现?

.NET MAUI CollectionView 多组数据分组展示解决方案

你的思路方向是对的,但数据模型的设计不太适配CollectionView的分组绑定规范,调整后就能实现需求,具体步骤如下:

1. 调整数据模型类

不要让分组类直接继承List<T>,改为让分组类包含一个集合属性,这种设计更符合数据绑定逻辑:

// 单个桌位数据类
public class NieweTafel
{
    public int tableIdId { get; set; }
    public string tableName { get; set; }
    public string tableStatus { get; set; }
}

// 分组类:包含组名和该组下的桌位集合
public class TafelGroep
{
    public string PlanName { get; set; }
    public List<NieweTafel> Tafels { get; set; } = new List<NieweTafel>();
}

// 无需额外继承List的容器类,直接用List<TafelGroep>作为数据源即可

2. 解析JSON数据到模型

假设你的JSON结构如下(若实际结构不同,微调解析逻辑即可):

{
  "Indoor": [
    {"tableIdId": 1, "tableName": "室内桌1", "tableStatus": "空闲"},
    {"tableIdId": 2, "tableName": "室内桌2", "tableStatus": "占用"}
  ],
  "Outdoor": [
    {"tableIdId": 3, "tableName": "室外桌1", "tableStatus": "空闲"},
    {"tableIdId": 4, "tableName": "室外桌2", "tableStatus": "占用"}
  ]
}

使用System.Text.Json解析并转换为List<TafelGroep>:

using System.Text.Json;

// 假设jsonString是你的JSON数据字符串
var jsonDoc = JsonDocument.Parse(jsonString);
var groups = new List<TafelGroep>();

foreach (var property in jsonDoc.RootElement.EnumerateObject())
{
    var tafels = JsonSerializer.Deserialize<List<NieweTafel>>(property.Value.ToString());
    groups.Add(new TafelGroep
    {
        PlanName = property.Name,
        Tafels = tafels
    });
}

// 将groups赋值给ViewModel的属性用于绑定

3. 配置CollectionView的XAML

在XAML中启用分组,指定组头模板和项模板:

<CollectionView 
    ItemsSource="{Binding TafelGroepen}"
    IsGrouped="True">
    
    <!-- 组头模板:显示分组名称 -->
    <CollectionView.GroupHeaderTemplate>
        <DataTemplate>
            <Label 
                Text="{Binding PlanName}"
                FontSize="Large"
                FontAttributes="Bold"
                Margin="10,5"/>
        </DataTemplate>
    </CollectionView.GroupHeaderTemplate>
    
    <!-- 项模板:显示单个桌位信息 -->
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Frame Margin="10,5" Padding="10">
                <StackLayout>
                    <Label Text="{Binding tableName}" FontSize="Medium"/>
                    <Label Text="{Binding tableStatus}" FontSize="Small" TextColor="Gray"/>
                    <Label Text="桌ID: {Binding tableIdId}" FontSize="Small"/>
                </StackLayout>
            </Frame>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

4. 绑定数据源

在ViewModel中添加对应属性:

public class MainViewModel
{
    public List<TafelGroep> TafelGroepen { get; set; } = new List<TafelGroep>();

    // 构造函数中加载数据(或通过命令触发加载)
    public MainViewModel()
    {
        // 调用JSON解析逻辑,给TafelGroepen赋值
    }
}

在页面后台设置BindingContext:

public MainPage()
{
    InitializeComponent();
    BindingContext = new MainViewModel();
}

关键注意事项

  • 确保分组类的集合属性(如Tafels)是可枚举类型,CollectionView会自动遍历每个分组下的子项
  • JSON解析逻辑要和实际JSON结构匹配,若JSON是数组形式的分组,调整遍历方式即可
  • 若使用MVVM框架,建议将TafelGroepen设为ObservableCollection<TafelGroep>,数据变化时UI会自动更新

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:05:19