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

.NET MAUI分组CollectionView iOS端懒加载不触发问题求助

解决.NET MAUI分组CollectionView在iOS端懒加载不触发的问题

针对你遇到的分组CollectionView在iOS端无法触发RemainingItemsThresholdReachedCommand的问题,以下是几个可行的解决方法:


方法一:自定义iOS渲染器监听滚动事件

通过自定义渲染器直接监听iOS原生UICollectionView的滚动事件,手动判断是否达到加载阈值并触发命令,绕过MAUI的平台bug。

1. 共享项目中定义自定义CollectionView

public class GroupedCollectionView : CollectionView
{
    public static readonly BindableProperty LoadMoreCommandProperty =
        BindableProperty.Create(nameof(LoadMoreCommand), typeof(ICommand), typeof(GroupedCollectionView));

    public ICommand LoadMoreCommand
    {
        get => (ICommand)GetValue(LoadMoreCommandProperty);
        set => SetValue(LoadMoreCommandProperty, value);
    }

    public static readonly BindableProperty RemainingThresholdProperty =
        BindableProperty.Create(nameof(RemainingThreshold), typeof(int), typeof(GroupedCollectionView), defaultValue: 0);

    public int RemainingThreshold
    {
        get => (int)GetValue(RemainingThresholdProperty);
        set => SetValue(RemainingThresholdProperty, value);
    }
}

2. iOS项目中实现自定义渲染器

[assembly: ExportRenderer(typeof(GroupedCollectionView), typeof(GroupedCollectionViewRenderer))]
namespace YourAppNamespace.iOS.Renderers
{
    public class GroupedCollectionViewRenderer : CollectionViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<CollectionView> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement is GroupedCollectionView groupedCV && Control is UICollectionView collectionView)
            {
                collectionView.ScrollView.Scrolled += (sender, args) =>
                {
                    var scrollView = sender as UIScrollView;
                    if (scrollView == null) return;

                    // 计算滚动位置,判断是否接近底部(100为缓冲高度,可按需调整)
                    bool isNearBottom = scrollView.ContentOffset.Y + scrollView.Frame.Height 
                                        >= scrollView.ContentSize.Height - 100;

                    if (isNearBottom 
                        && groupedCV.RemainingThreshold != -1 
                        && groupedCV.LoadMoreCommand != null 
                        && groupedCV.LoadMoreCommand.CanExecute(null))
                    {
                        groupedCV.LoadMoreCommand.Execute(null);
                    }
                };
            }
        }
    }
}

3. 修改XAML中的控件引用

替换原CollectionView为自定义控件,并绑定对应属性:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:YourAppNamespace"
             x:Class="YourAppNamespace.YourPage">

    <local:GroupedCollectionView Margin="5,0,5,0" 
                                 SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
                                 SelectionChangedCommand="{Binding ItemSelectCommand}"    
                                 SelectionMode="Single"
                                 ItemsSource="{Binding TaskList}"
                                 ItemTemplate="{StaticResource TaskSelector}"
                                 EmptyView="No Tasks to display"
                                 IsGrouped="True"
                                 RemainingThreshold="{Binding ItemThreshold}"
                                 LoadMoreCommand="{Binding LoadMoreDataCommand}">
        <local:GroupedCollectionView.ItemsLayout>
            <LinearItemsLayout Orientation="Vertical" ItemSpacing="2" />
        </local:GroupedCollectionView.ItemsLayout>
        <local:GroupedCollectionView.GroupHeaderTemplate>
            <DataTemplate>
                <Label Text="{Binding Type}" FontSize="18" FontAttributes="Bold" />
            </DataTemplate>
        </local:GroupedCollectionView.GroupHeaderTemplate>
        <local:GroupedCollectionView.Footer>
            <StackLayout>
                <ActivityIndicator IsRunning="True" IsVisible="{Binding IsLoading}" HeightRequest="40" WidthRequest="40" HorizontalOptions="Center" />
            </StackLayout>
        </local:GroupedCollectionView.Footer>
    </local:GroupedCollectionView>
</ContentPage>

方法二:升级MAUI版本

检查当前使用的MAUI版本,若该平台bug已在新版本中修复(可查看官方issue状态),直接升级到对应版本即可解决问题。


方法三:临时替代方案(使用ListView)

若自定义渲染器实现成本较高,可临时改用ListView替代CollectionView——ListView的分组懒加载在iOS端兼容性更稳定,不过该控件已被MAUI标记为逐步淘汰,仅建议作为临时过渡方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 18:20:36