Инструментарий сообщества Xamarin TouchEffect.Command не работает в CollectionView

Я пытаюсь использовать длинное нажатие и короткое нажатие команды в CollectionView. Я использую Xamarin.Community.ToolKit, но целевая команда ViewModel не вызывается. TouchEffect работает вне CollectionView. Но не тогда, когда он находится внутри CollectionView.

Ниже представлен вид коллекции:

                  <CollectionView x:Name="ItemsCollectionView"
                ItemsSource="{Binding FolderFiles}" 
                VerticalOptions="FillAndExpand"
                SelectionMode="{Binding SelectionModeFolderFile}"
                SelectedItems="{Binding SelectedFolderFiles}"
                >
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        
                        <Grid xct:TouchEffect.Command="{Binding ShortPressCommandSelection}"
                              xct:TouchEffect.LongPressCommand="{Binding LongPressCommandSelection}"
                              xct:TouchEffect.NativeAnimation="True"
                              >
                            <Grid.RowDefinitions>
                                <RowDefinition Height="45"></RowDefinition>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="10*"></ColumnDefinition>
                                <ColumnDefinition Width="60*"></ColumnDefinition>
                                <ColumnDefinition Width="10*"></ColumnDefinition>
                                <ColumnDefinition Width="10*"></ColumnDefinition>
                                <ColumnDefinition Width="10*"></ColumnDefinition>
                            </Grid.ColumnDefinitions>


                            <Image Grid.Row="0" Grid.Column="0"  x:Name="imgFileOrFolder" Source="{Binding ImgFileOrFolderSource}"   VerticalOptions="Center" WidthRequest="15" >
                            </Image>

                            <Label Grid.Row="0" VerticalTextAlignment="Center" Grid.Column="1" Text="{Binding Name}" 
                            LineBreakMode="NoWrap" 
                            Style="{DynamicResource ListItemTextStyle}" 
                            FontSize="12" />

                            <Image Grid.Row="0" Grid.Column="2"  x:Name="imgPlay" Source="{Binding ImgPlaySource}"  VerticalOptions="Center" WidthRequest="25">
                                <Image.GestureRecognizers>
                                    <TapGestureRecognizer CommandParameter="{Binding Path}"
                                Tapped="PlayTapped" />
                                </Image.GestureRecognizers>
                            </Image>

                            <Image Grid.Row="0" Grid.Column="3"  x:Name="imgShuffle" Source="{Binding ImgShuffleSource}"  VerticalOptions="Center" WidthRequest="25">
                                <Image.GestureRecognizers>
                                    <TapGestureRecognizer CommandParameter="{Binding Path}"
                                Tapped="ShuffleTapped" />
                                </Image.GestureRecognizers>
                            </Image>

                            <Image Grid.Row="0" Grid.Column="4"  x:Name="imgMoreInfo" Source="{Binding ImgMoreInfoSource}"  VerticalOptions="Center" WidthRequest="15">
                                <Image.GestureRecognizers>
                                    <TapGestureRecognizer
                                Tapped="MoreInfoTapped" />
                                </Image.GestureRecognizers>
                            </Image>
                        </Grid>

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

Свойства модели целевого представления:

          public ICommand LongPressCommandSelection { get; set; }

    public ICommand ShortPressCommandSelection { get; set; }

Конструктор:

              LongPressCommandSelection = new Command(LongPressCommand_SelectionChanged);
        ShortPressCommandSelection = new Command(ShortPressCommand_SelectionChanged);

Методы:

          public void LongPressCommand_SelectionChanged()
    {
        Console.Write("selection changed");

    }

    public void ShortPressCommand_SelectionChanged()
    {
        Console.Write("selection changed");
    }

1 ответ

Проблема не в TouchEffect, проблема в вашем Binding, потому что внутри DataTemplate если не указано, будет переопределено (изменено) на значение ItemsSource вместо унаследованного.

Вы связываетесь с неправильным BindingContext (источник), во время отладки, если вы откроете и посмотрите на окно / панель «Ошибки привязки xaml», вы увидите явные четкие ошибки, говорящие что-то вроде LongPressCommandSelection не может быть найден в FolderFiles, в этом случае следует указать источник привязки:

      <ContentPage x:Name="thisPage" ...>
...
<Grid xct:TouchEffect.LongPressCommand="{Binding Source={x:Reference thisPage}, Path=BindingContext.LongPressCommandSelection}"