GestureRecognizer не работает на CollectionView с DataTemplate - PullRequest
0 голосов
/ 13 марта 2020

Я играю в Xamarin с GestureRecognizer, и у меня есть следующий код:

<CollectionView
  Grid.Row="0"
  EmptyView="No player information"
  ItemsSource="{Binding Voices, Mode=OneWay}">

  <CollectionView.GestureRecognizers>
    <TapGestureRecognizer
      Command="{Binding CommandPlayerTapped}"
      CommandParameter="hi"
      NumberOfTapsRequired="1" />
  </CollectionView.GestureRecognizers>

  <CollectionView.ItemTemplate>
    <DataTemplate>

      <StackLayout>
        <views:PancakeItemView Margin="5" BorderColor="Black">
          <views:VoiceInfoContainerView Style="{StaticResource VoiceDisplayStyle}" />
        </views:PancakeItemView>
      </StackLayout>

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

My TapGestureRecognizer привязан к простой команде, которая создает всплывающее сообщение; ничего сложного. DataTemplate - это PancakeView, заключающий в себе простое представление, отображающее некоторые имена, подобные показанным здесь:

Screenshot showing View

Опять же, в этом нет ничего сложного, однако я чувствую это возможно, в этом и заключается проблема, поскольку я не могу найти другую информацию в Интернете.

Я пытался вставить код жеста в другие элементы, но безуспешно. Любые идеи относительно того, почему касание этих представлений не вызывает команду?

1 Ответ

1 голос
/ 13 марта 2020

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>

НО

Это ужасный способ сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...