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
?
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.