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

.NET 9 MAUI中CollectionView滚动加载长列表时无报错崩溃问题求助

.NET 9 MAUI中CollectionView滚动加载长列表时无报错崩溃问题求助

嗨各位MAUI圈的大佬们,最近把.NET8里的语言选择组件迁到.NET9,踩了个巨头疼的坑:原来用ListView,现在换成CollectionView做分组展示,还加了滚动加载(靠RemainingItemsThresholdReachedCommand实现),初始的一批数据能正常显示,但一往下滑触发加载更多的时候,APP直接原地崩溃,连个错误日志都没输出,排查起来完全摸不着头脑!

先把相关代码贴出来,麻烦各位帮忙定位下问题:

1. CollectionView的XAML代码

<CollectionView Grid.Row="2" ItemsSource="{Binding Groups}" IsGrouped="True" SelectionMode="None" RemainingItemsThreshold="10" RemainingItemsThresholdReachedCommand="{Binding LoadMoreCommand}" ItemSizingStrategy="MeasureFirstItem">
    <CollectionView.GroupHeaderTemplate>
        <DataTemplate x:DataType="model:LanguageModelGroup">
            <Grid Padding="0,12,0,6" BackgroundColor="{DynamicResource SecondaryColor}">
                <Label Text="{Binding Name}" FontAttributes="Bold" TextColor="{DynamicResource SecondaryTextColor}" Margin="8,0"/>
            </Grid>
        </DataTemplate>
    </CollectionView.GroupHeaderTemplate>
    <CollectionView.ItemTemplate>
        <DataTemplate x:DataType="model:LanguageModel">
            <Grid Padding="8,6" ColumnDefinitions="*,Auto" BackgroundColor="{DynamicResource ContentBackgroundColor}">
                <HorizontalStackLayout Spacing="10">
                    <Image Source="{Binding Flag}" WidthRequest="28" HeightRequest="20" Aspect="AspectFill" VerticalOptions="Center" />
                    <Label Text="{Binding LanguageName}" VerticalOptions="Center" LineBreakMode="TailTruncation" />
                </HorizontalStackLayout>
                <Label Grid.Column="1" Text="{Binding Abbreviation}" VerticalOptions="Center" HorizontalTextAlignment="End" TextColor="{DynamicResource SecondaryTextColor}" />
                <Grid.GestureRecognizers>
                    <TapGestureRecognizer Command="{Binding Source={RelativeSource AncestorType={x:Type toolkit:Popup}}, Path=BindingContext.SelectCommand}" CommandParameter="{Binding .}" />
                </Grid.GestureRecognizers>
            </Grid>
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

2. ViewModel里的过滤与加载逻辑

public List<LanguageModel>? allLanguages;
public List<LanguageModelGroup>? groupedLanguages;

void FilterLanguages(string searchText = "", string filterType = "All")
{
    currentIndex = 0;
    visibleLanguages.Clear();
    var filteredLanguages = allLanguages?
        .Where(l => string.IsNullOrEmpty(searchText) || l.LanguageName?.Contains(searchText, StringComparison.OrdinalIgnoreCase) == true)
        .Where(l => filterType == "All" || (filterType == "Supported languages" && l.IsSupported))
        .ToList();

    groupedLanguages = filteredLanguages
        .GroupBy(l => l.Parent?.LanguageName ?? "Unknown")
        .Select(g => new LanguageModelGroup(g.Key, g))
        .ToList();

    LoadNextPage();
}

void LoadNextPage()
{
    var nextItems = groupedLanguages
        .Skip(currentIndex)
        .Take(pageSize);
    visibleLanguages.AddRange(nextItems);
    OnPropertyChanged(nameof(visibleLanguages));
    LanguageCollectionView.ItemsSource = visibleLanguages;
    currentIndex += pageSize;
}

3. 数据模型定义

public class LanguageModel
{
    public string? LanguageName { get; set; }
    public LanguageModel? Parent { get; set; }
    public string? Abbreviation { get; set; }
    public string? Flag { get; set; }
    public bool IsSupported { get; set; } = false;
}

public class LanguageModelGroup : ObservableCollection<LanguageModel>
{
    public string GroupName { get; private set; }

    public LanguageModelGroup(string name, IEnumerable<LanguageModel> languages) : base(languages)
    {
        GroupName = name;
    }
}

自己瞎琢磨了半天,做了几个尝试但都没解决:

  • 确认了visibleLanguages是ObservableCollection<LanguageModelGroup>,绑定应该没问题
  • 把ItemSizingStrategy换成MeasureAllItems试了,还是崩
  • 临时注释掉分组逻辑,用普通CollectionView做滚动加载完全正常,一加上分组就崩,感觉问题肯定出在分组的滚动加载逻辑上?

有没有大佬遇到过类似的情况,或者能一眼看出我代码里的坑?跪求指点!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 06:49:34