CollectionView имеет свойство для SelectedItem
SelectionMode="Single"
SelectedItem="{Binding SelectedVoice}"
А затем на вашей ViewModel:
private Voice _selectedVoice; //I don't know what type of items is your Collection Voices, so i'm using Voice here
public Voice SelectedVoice
{
get { return _selectedVoice; }
set {
_selectedVoice = value;
CommandPlayerTapped.Execute();
}
}
...
//On the function that CommandPlayerTapped called:
if(SelectedVoice != null)
{
//Your code
}
else{
//The Item was deselected
}
Вот еще немного о как вы пытались ранее и почему это не сработало:
Если вы пытаетесь установить GestureRecognizer для каждого элемента в CollectionView, вы используете его не в том месте, вы устанавливаете RG в Сама коллекция, не в каждом элементе.
Вам нужно передать правильный BindingContext , у вашего элемента есть Voices
ItemSource BindingContext, но вместо этого вам нужен контекст ViewModel, вы можете ссылаться на Другой контекст (например, сам CollectionView),
Сначала создайте ссылку на CollectionView, добавив x: Name = "CollectionViewForBinding", например:
<CollectionView
x:Name="CollectionViewForBinding"
Grid.Row="0"
EmptyView="No player information"
ItemsSource="{Binding Voices, Mode=OneWay}">
И затем вы будете ссылаться на BindingContext следующим образом :
<StackLayout>
<StackLayout.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding BindingContext.CommandPlayerTapped, Source={x:Reference Name=CollectionViewForBinding}}"
CommandParameter="{Binding ThePropertyOfTheItemYouWantToPass}"
NumberOfTapsRequired="1" />
</StackLayout.GestureRecognizers>
<views:PancakeItemView Margin="5" BorderColor="Black">
<views:VoiceInfoContainerView Style="{StaticResource VoiceDisplayStyle}" />
</views:PancakeItemView>
</StackLayout>
НО
Это ужасный способ сделать это.