微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Xamarin 社区工具包 TouchEffect.Command 在 CollectionView 中不起作用

如何解决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");
    }

解决方法

问题不在于 TouchEffect 问题在于您的绑定,因为在 DataTemplate 中,如果未指定 BindingContext 将被覆盖(更改)为 ItemsSource 的值而不是继承了BindingContext

您绑定了错误的 BindingContext(源代码),在调试过程中,如果您打开并查看“xaml 绑定失败”窗口/窗格,您将看到明确的明确错误,说明 LongPressCommandSelection 可以在 FolderFiles 中找不到,在这种情况下您应该指定您的绑定源:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。