Прокрутить список CollectionView

Эсть такая разметка:

<Border BackgroundColor="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Primary}}" StrokeThickness="0">
    <Border.StrokeShape>
        <RoundRectangle CornerRadius="0,0,55,55" />
    </Border.StrokeShape>

    <RefreshView RefreshColor="{StaticResource PrimaryDark}" IsRefreshing="{Binding IsRefreshing}" Command="{Binding RefreshCommand}" HorizontalOptions="FillAndExpand">
        <ScrollView Orientation="Vertical" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" VerticalScrollBarVisibility="Never" Margin="10,0,10,0">
            <Grid RowDefinitions="Auto,Auto,Auto,*" RowSpacing="10">
                <Grid ColumnDefinitions="*,Auto" ColumnSpacing="10" Margin="10,10,10,0">
                    <Border HeightRequest="40" Stroke="{StaticResource PrimaryDark}" StrokeThickness="2" Padding="10,0">
                        <Border.StrokeShape>
                            <RoundRectangle CornerRadius="10" />
                        </Border.StrokeShape>

                        <Grid ColumnDefinitions="*, Auto, Auto">
                            <Label Grid.Column="0" Text="Поиск..." VerticalTextAlignment="Center" FontFamily="MontserratRegular" FontSize="18" Margin="0,0,10,0"
                                   TextColor="{StaticResource PrimaryDark}" />
                            <Image Grid.Column="1" Source="search_primary_dark.svg" WidthRequest="25" HeightRequest="25" Margin="5,0,10,0" />
                            <Label Grid.Column="2" Text="Поиск" VerticalTextAlignment="Center" FontFamily="MontserratSemiBold" FontSize="14" Margin="0,0,10,0"
                                   TextColor="{StaticResource PrimaryDark}" />

                            <Grid.GestureRecognizers IsEnabled="{Binding IsEnabled}">
                                <TapGestureRecognizer Command="{Binding NavigateTSearchPageCommand}" />
                            </Grid.GestureRecognizers>
                        </Grid>
                    </Border>

                    <Button Grid.Column="1" Text="Добавить" TextTransform="Uppercase" WidthRequest="120" HeightRequest="40" Padding="10" 
                            Style="{StaticResource outlineButtonStyle}" Command="{Binding AddNewItemCommand}" IsEnabled="{Binding IsEnabled}" />
                </Grid>

                <VerticalStackLayout Grid.Row="1" Margin="5,0,5,0" Spacing="10">
                    <Border BackgroundColor="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource PrimaryDark}}"
                            Stroke="{AppThemeBinding Light={StaticResource Primary}, Dark={StaticResource PrimaryDark}}" WidthRequest="120" HeightRequest="120">
                        <Border.StrokeShape>
                            <RoundRectangle CornerRadius="50" />
                        </Border.StrokeShape>
                        <Image Source="{AppThemeBinding Light=group_primary_dark.svg, Dark=group_primary.svg}" WidthRequest="80" HeightRequest="80" />
                    </Border>

                    <Label Text="Пользователи" FontSize="20" TextTransform="Uppercase" FontAttributes="Bold" FontFamily="MontserratBold" TextColor="{StaticResource PrimaryDark}" 
                           LineBreakMode="WordWrap" HorizontalTextAlignment="Center" />
                </VerticalStackLayout>

                <Grid Grid.Row="2" ColumnDefinitions="Auto,*,Auto">
                    <Grid ColumnDefinitions="Auto,Auto,Auto,*" Margin="10,0" HorizontalOptions="Start" VerticalOptions="Center">
                        <Image Source="filter_alt_primary_dark.svg" WidthRequest="25" HeightRequest="25" />

                        <Picker Grid.Column="1" x:Name="userRolesPicker" FontSize="18" FontFamily="MontserratSemiBold" TextColor="{StaticResource PrimaryDark}"
                                ItemsSource="{Binding RolesValueList}" ItemDisplayBinding="{Binding Title}" 
                                SelectedIndex="{Binding SelectedIndexRole}" SelectedItem="{Binding SelectedRole}" IsEnabled="{Binding IsEnabled}" />

                        <Image Grid.Column="2" Source="keyboard_arrow_down_primary_dark.svg" WidthRequest="25" HeightRequest="25">
                            <Image.GestureRecognizers>
                                <TapGestureRecognizer Tapped="ArrowDownTapped" />
                            </Image.GestureRecognizers>
                        </Image>

                        <Label Grid.Column="3" Text="{Binding UsersCount}" VerticalTextAlignment="Center" FontFamily="MontserratRegular" FontSize="18" Margin="5,0"
                               TextColor="{StaticResource PrimaryDark}" />
                    </Grid>

                    <Grid Grid.Column="2" ColumnDefinitions="Auto,Auto" Margin="10,0" HorizontalOptions="End" VerticalOptions="Center">
                        <Label FontSize="18" FontFamily="MontserratSemiBold" TextColor="{StaticResource PrimaryDark}">
                            <Label.Triggers>
                                <DataTrigger TargetType="Label" Binding="{Binding isOrderBy}" Value="True">
                                    <Setter Property="Text" Value="А-я" />
                                </DataTrigger>
                                <DataTrigger TargetType="Label" Binding="{Binding isOrderBy}" Value="False">
                                    <Setter Property="Text" Value="Я-а" />
                                </DataTrigger>
                            </Label.Triggers>
                        </Label>

                        <Image Grid.Column="1" Source="swap_vert_primary_dark.svg" WidthRequest="25" HeightRequest="25" />

                        <Grid.GestureRecognizers IsEnabled="{Binding IsEnabled}">
                            <TapGestureRecognizer Command="{Binding SortedByCommand}" />
                        </Grid.GestureRecognizers>
                    </Grid>

                    <Grid.Triggers>
                        <DataTrigger TargetType="Grid" Binding="{Binding Source={x:Reference listView}, Path=ItemsSource.Count}" Value="0">
                            <Setter Property="IsVisible" Value="False" />
                        </DataTrigger>
                    </Grid.Triggers>
                </Grid>

                <ActivityIndicator Grid.Row="3" IsRunning="{Binding IsLoading}" Style="{StaticResource primaryDarkActivityIndicatorStyle}" />

                <CollectionView x:Name="listView" Grid.Row="3" ItemsSource="{Binding GroupedUsersList}" EmptyView="Нет элементов для отображения..." IsGrouped="true"
                                HorizontalScrollBarVisibility="Never" VerticalScrollBarVisibility="Never" SelectionMode="None" Margin="0,0,0,20">
                    <CollectionView.GroupHeaderTemplate>
                        <DataTemplate>
                            <Label Text="{Binding GroupName}" FontSize="20" FontAttributes="Bold" FontFamily="MontserratBold" TextColor="{StaticResource PrimaryDark}"
                                   Margin="10">
                                <Label.GestureRecognizers IsEnabled="{Binding IsEnabled}">
                                    <TapGestureRecognizer Command="{Binding Source={RelativeSource AncestorType={Type viewModel:UsersListEditorViewModel}}, 
                                        Path= NavigateToAlphabeticalIndexPageCommand}" />
                                </Label.GestureRecognizers>
                            </Label>
                        </DataTemplate>
                    </CollectionView.GroupHeaderTemplate>

                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <SwipeView IsEnabled="{Binding IsEnabled}">
                                <SwipeView.LeftItems>
                                    <SwipeItems>
                                        <SwipeItem IconImageSource="edit_primary_dark.svg" BackgroundColor="{StaticResource PrimaryDark}"
                                                   Command="{Binding Source={x:Reference listView}, Path=BindingContext.EditItemCommand}" CommandParameter="{Binding}" />
                                        <SwipeItem IconImageSource="content_copy_primary_dark.svg" BackgroundColor="{StaticResource PrimaryDark}"
                                                   Command="{Binding Source={x:Reference listView}, Path=BindingContext.CopyItemCommand}" CommandParameter="{Binding}" />
                                    </SwipeItems>
                                </SwipeView.LeftItems>
                                <SwipeView.RightItems>
                                    <SwipeItems>
                                        <SwipeItem IconImageSource="delete_primary_dark.svg" BackgroundColor="{StaticResource PrimaryDark}"
                                                   Command="{Binding Source={x:Reference listView}, Path=BindingContext.DeleteItemCommand}" CommandParameter="{Binding}" />
                                    </SwipeItems>
                                </SwipeView.RightItems>

                                <control:ViewCellWithImageContent Title="{Binding FullName}" SubTitle="{Binding Email}" 
                                                                  BackgroundColor="{AppThemeBinding Light={StaticResource White}, Dark={StaticResource Primary}}"
                                                                  TextColor="{StaticResource PrimaryDark}" IconImageSource="user_primary_dark.svg"
                                                                  SupIconImageSource1="admin_panel_settings_primary_dark.svg" isVisibleSupIconIconImageSource1="{Binding IsAdmin}"
                                                                  SupIconImageSource2="lock_primary_dark.svg" isVisibleSupIconIconImageSource2="{Binding Lockout}"
                                                                  SubIconImageSource="mark_email_read_primary_dark.svg" isVisibleSubIconIconImageSource="{Binding EmailConfirmed}" />
                            </SwipeView>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
            </Grid>
        </ScrollView>
    </RefreshView>
</Border>

Использую общий scroll для прокрутки страницы, это удобно на небольших дисплеях и при горизонтальной ориентации экрана. Так же на странице присутствует сгрупированный список CollectionView. По клику на группу пользователь перенаправляется на страницу алфавитного указателя. На ней английский и русский алфавиты. Буквы которые есть в группах списка выделены и кликабельные, остальные нет. По клику на букву пользователь возвращается обратно на предыдущую страницу и после завершения навигации необходимо прокрутить CollectionView до выбранной группы. Использовал такой метод CollectionView.ScrollTo(0, ScrollToIndex, ScrollToPosition.Start, true); Проблема в том, что ScrollView блокирует scroll CollectionView и не какой прокрутки не происходит. Без общего ScrollView всё работает, но без него при горизонтальной ориентации дисплея страница не прокручивается и список не виден, да и на небольших дисплеях неудобно. У ScrollView есть своя прокрутка, но она не подходит. Как я понял, судя по методам, можно прокрутить либо до определённых независимых от устройства единиц (await scrollView.ScrollToAsync(0, 150, true);), либо до объекта на разметке (await scrollView.ScrollToAsync(listView, ScrollToPosition.End, true);), например до CollectionView. Вопрос, как сделать прокрутку CollectionView до определённой группы?


Ответы (0 шт):