.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
相关产品推荐
相关产品推荐

