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

分组后如何在Xamarin.Forms父ListView列表项中绑定嵌套ListView

解决Xamarin.Forms分组ListView嵌套子ListView的问题

我来帮你搞定这个嵌套列表的需求,核心是先搭好层级数据模型,再在XAML里正确绑定数据源,同时注意列表的性能优化。

第一步:构建层级数据模型

首先得定义三层数据结构:分组→父列表项→子列表项,每个层级都要有对应的集合属性,确保数据能层层传递:

// 子列表项模型
public class ChildItemModel
{
    public string ChildName { get; set; }
    // 可根据需求添加其他子项属性
}

// 父列表项模型(包含子项集合)
public class ParentItemModel
{
    public string ParentName { get; set; }
    public ObservableCollection<ChildItemModel> ChildItems { get; set; }
    
    public ParentItemModel()
    {
        ChildItems = new ObservableCollection<ChildItemModel>();
    }
}

// 分组模型(包含父项集合)
public class GroupModel : ObservableCollection<ParentItemModel>
{
    public string GroupName { get; set; }

    public GroupModel(string groupName, IEnumerable<ParentItemModel> items) : base(items)
    {
        GroupName = groupName;
    }
}

第二步:准备ViewModel的分组数据源

在你的ViewModel里,按照你想要的层级结构填充模拟数据(实际项目可替换为接口返回的数据):

public class MainViewModel : INotifyPropertyChanged
{
    private ObservableCollection<GroupModel> _groupedItems;
    public ObservableCollection<GroupModel> GroupedItems
    {
        get => _groupedItems;
        set
        {
            _groupedItems = value;
            OnPropertyChanged();
        }
    }

    public MainViewModel()
    {
        // 严格匹配你要的层级结构填充数据
        GroupedItems = new ObservableCollection<GroupModel>
        {
            new GroupModel("分组标题1", new List<ParentItemModel>
            {
                new ParentItemModel
                {
                    ParentName = "父列表项1",
                    ChildItems = { new ChildItemModel{ChildName="嵌套列表项1"}, new ChildItemModel{ChildName="嵌套列表项2"} }
                },
                new ParentItemModel
                {
                    ParentName = "父列表项2",
                    ChildItems = { new ChildItemModel{ChildName="嵌套列表项1"}, new ChildItemModel{ChildName="嵌套列表项2"} }
                }
            }),
            new GroupModel("分组标题2", new List<ParentItemModel>
            {
                new ParentItemModel
                {
                    ParentName = "父列表项1",
                    ChildItems = { new ChildItemModel{ChildName="嵌套列表项1"} }
                },
                new ParentItemModel
                {
                    ParentName = "父列表项2",
                    ChildItems = { new ChildItemModel{ChildName="嵌套列表项1"}, new ChildItemModel{ChildName="嵌套列表项2"}, new ChildItemModel{ChildName="嵌套列表项3"} }
                }
            })
        };
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

第三步:XAML中实现分组+嵌套ListView

在ContentPage里绑定ViewModel,配置父ListView启用分组,再在父项的DataTemplate里嵌套子ListView:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:YourProjectNamespace"
             x:Class="YourProjectNamespace.MainPage">

    <ContentPage.BindingContext>
        <local:MainViewModel />
    </ContentPage.BindingContext>

    <ListView x:Name="ParentListView"
              IsGroupingEnabled="True"
              GroupDisplayBinding="{Binding GroupName}"
              ItemsSource="{Binding GroupedItems}"
              CachingStrategy="RecycleElement"
              HasUnevenRows="True">

        <!-- 分组标题模板 -->
        <ListView.GroupHeaderTemplate>
            <DataTemplate>
                <ViewCell>
                    <Label Text="{Binding GroupName}"
                           FontSize="Large"
                           FontAttributes="Bold"
                           Padding="10,5"/>
                </ViewCell>
            </DataTemplate>
        </ListView.GroupHeaderTemplate>

        <!-- 父列表项模板(包含嵌套子ListView) -->
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout Padding="10">
                        <!-- 父列表项标题 -->
                        <Label Text="{Binding ParentName}"
                               FontSize="Medium"
                               FontAttributes="Italic"/>
                        <!-- 嵌套子ListView -->
                        <ListView ItemsSource="{Binding ChildItems}"
                                  CachingStrategy="RecycleElement"
                                  HasUnevenRows="True"
                                  Margin="15,5,0,5">
                            <ListView.ItemTemplate>
                                <DataTemplate>
                                    <ViewCell>
                                        <Label Text="{Binding ChildName}"
                                               FontSize="Small"/>
                                    </ViewCell>
                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentPage>

关键注意点

  • 分组启用:父ListView必须设置IsGroupingEnabled="True",并通过GroupDisplayBinding绑定分组标题属性,才能正确显示分组头。
  • 绑定路径:子ListView的ItemsSource直接绑定ChildItems即可——因为此时父ItemTemplate的BindingContext是ParentItemModel实例,能直接访问其内部属性。
  • 性能优化:设置CachingStrategy="RecycleElement"减少内存占用,HasUnevenRows="True"让子列表自动适应内容高度,避免出现子项显示不全的问题。
  • 集合类型:建议用ObservableCollection,这样数据发生变化时UI能自动同步更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:56:32