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

CollectionView无限加载失效:RemainingItemsThresholdReached事件未触发求助

CollectionView增量加载:RemainingItemsThresholdReached事件/命令未触发排查

我尝试为CollectionView实现增量加载功能,但RemainingItemsThresholdReached事件始终未被触发,同时尝试使用RemainingItemsThresholdReachedCommand也没有效果。以下是相关代码:

XAML代码

<CollectionView x:Name="collectionView" ItemsSource="{Binding Users}"  VerticalScrollBarVisibility="Always"
                RemainingItemsThreshold="3"
                RemainingItemsThresholdReached="LoadMoreAsync" >
    <CollectionView.ItemTemplate>
        <DataTemplate >
            <Border Stroke="White" Background="Black" StrokeThickness="2"
                    Padding="8" Margin="10">
                <Border.StrokeShape>
                    <RoundRectangle CornerRadius="10,10,10,10"/>
                </Border.StrokeShape>
                <StackLayout >
                    <StackLayout Orientation="Horizontal" Spacing="20" Padding="10">
                        <Image Source="download.png" HeightRequest="40" WidthRequest="40" />
                        <Label Text="{Binding UserName}" FontSize="14" FontAttributes="Bold" />
                    </StackLayout>
                    <BoxView Color="Gray" HeightRequest="2" HorizontalOptions="Fill" />
                    <Label Padding="7" Text="{Binding Description}"/>
                    <BoxView Color="Gray" HeightRequest="1" HorizontalOptions="Fill" />
                    <StackLayout Orientation="Horizontal" Spacing="20" Padding="10">
                        <Grid   HorizontalOptions="FillAndExpand">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition  Width="*"/>
                                <ColumnDefinition  Width="*"/>
                            </Grid.ColumnDefinitions>

                            <Grid.RowDefinitions>
                                <RowDefinition Height="30" />
                            </Grid.RowDefinitions>
                            <ImageButton  Grid.Row="0" Grid.Column="0" Source="user.png" HeightRequest="20" WidthRequest="20" />
                            <ImageButton  Grid.Row="0" Grid.Column="1" Source="like.png" HeightRequest="20" WidthRequest="20" />
                            <ImageButton  Grid.Row="0" Grid.Column="2" Source="chat.png" HeightRequest="20" WidthRequest="20" />
                        </Grid>

                    </StackLayout>
                </StackLayout>
            </Border>

        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

后端代码

public void LoadMoreAsync(object sender, EventArgs e)
{
    if (IsBusy)
        return;

    IsBusy = true;

    GetUsers(pageNumber, 6);
    pageNumber++;

    IsBusy = false;
}

可能的排查与解决方向
  • 检查ItemsSource集合类型:确保Users是ObservableCollection<T>或实现INotifyCollectionChanged的集合。普通List<T>无法让CollectionView感知集合更新,会导致阈值判断失效。
  • 验证阈值触发的数量条件:当集合总元素数 ≤ RemainingItemsThreshold时,事件不会触发。比如初始加载6条、阈值设为3,滚动到底部时剩余3条应该触发;如果初始数据不足,或后续加载后总数量仍未超过阈值,事件不会触发。
  • 确保CollectionView具备滚动条件:如果CollectionView嵌套在不支持滚动的容器(如未设置VerticalOptions="FillAndExpand"的StackLayout),或父容器滚动优先级更高,会导致CollectionView无法正确检测滚动位置,进而不触发阈值事件。检查布局结构,保证CollectionView有足够滚动空间。
  • 修正IsBusy异步逻辑:当前代码中IsBusy设为true后立即调用GetUsers,随后马上重置为false。若GetUsers是异步方法,会导致IsBusy在加载完成前就被重置,引发触发异常。应改为异步处理:
    public async void LoadMoreAsync(object sender, EventArgs e)
    {
        if (IsBusy)
            return;
    
        IsBusy = true;
    
        await GetUsers(pageNumber, 6); // 假设GetUsers为异步方法
        pageNumber++;
    
        IsBusy = false;
    }
    
  • 确认ScrollMode未被禁用:检查CollectionView是否设置了ScrollMode="Disabled",默认ScrollMode="Enabled",禁用滚动会导致滚动相关阈值事件无法触发。
  • 测试阈值触发逻辑:手动增加初始数据量(如加载10条),滚动至接近底部观察是否触发;或把RemainingItemsThreshold设为0,看滚动到底部时是否触发,以此验证阈值逻辑是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:19:23