.netmauimaui-collectionview

How to handle second tap on the same CollectionView element?


I have CollectionView with SelectionChanged handler. It works when I choose the element first time, but nothing happens when I'm choosing the same element second time.

            <CollectionView
                ItemsSource="{Binding Players}"
                SelectedItem="{Binding SelectedPlayer}"
                SelectionChanged="CollectionView_SelectionChanged"
                SelectionMode="Single">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <local:PlayerTile Player="{Binding}" />
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>

I tried to use SelectionChangedCommand, nothing matters.

When I introduced local:PlayerTile.GestureRecognizers, SelectionChanged stops working.

            <CollectionView
                ItemsSource="{Binding Players}"
                SelectedItem="{Binding SelectedPlayer}"
                SelectionChanged="CollectionView_SelectionChanged"
                SelectionMode="Single">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <local:PlayerTile Player="{Binding}">
                            <local:PlayerTile.GestureRecognizers>
                                <TapGestureRecognizer Tapped="OnTapped" />
                            </local:PlayerTile.GestureRecognizers>
                        </local:PlayerTile>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>

Do I have any other way to handle second tap, except moving all logic from my CollectionView_SelectionChanged to OnTapped?


Solution

  • I resolved this in the following way:

    1. Keep both SelectionChanged and Tapped:

                <CollectionView
                    x:Name="PlayersCollectionView"
                    ItemsSource="{Binding Players}"
                    SelectedItem="{Binding SelectedPlayer}"
                    SelectionChanged="CollectionView_SelectionChanged"
                    SelectionMode="Single">
                    <CollectionView.ItemTemplate>
                        <DataTemplate>
                            <local:PlayerTile Player="{Binding}">
                                <local:PlayerTile.GestureRecognizers>
                                    <TapGestureRecognizer Tapped="CollectionView_Tapped" />
                                </local:PlayerTile.GestureRecognizers>
                            </local:PlayerTile>
                        </DataTemplate>
                    </CollectionView.ItemTemplate>
                </CollectionView>
    

    2. If selection changed, I manually updated SelectedItem the trigger SelectionChanged behavior and the collection visuality.

        // HACK: handle second tap on the same item
        private void CollectionView_Tapped(object sender, TappedEventArgs e)
        {
            if (PlayersCollectionView.SelectedItem == ((PlayerTile)sender).Player)
            {
                // do my logic for second tap
            }
            else
            {
                // Update collection's selection
                PlayersCollectionView.SelectedItem = ((PlayerTile)sender).Player;
            }
        }
    

    It really seems like a hack, hope in future MS will allow handling second tap on the collection elements.