GestureRecognizers 在 ListView 中不起作用

env*_*yM6 7 c# xaml xamarin xamarin.forms

我有一个 ListView 如下

<ListView
        Grid.Row="0"
        Margin="0"
        x:Name="ItemsListView"
        ItemsSource="{Binding SourceItems}"
        VerticalOptions="FillAndExpand"
        HasUnevenRows="false"
        RefreshCommand="{Binding LoadItemsCommand}"
        IsPullToRefreshEnabled="true"
        IsRefreshing="{Binding IsBusy}"
        ItemSelected="OnItemSelected"
        IsVisible="{Binding ShowListView}"
        RowHeight="55">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid
                        Margin="15,0,0,0"
                        Padding="0"
                        RowSpacing="0"
                        ColumnSpacing="0">
                        <Grid.RowDefinitions>
                            <RowDefinition
                                Height="*" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition
                                Width="1*" />
                            <ColumnDefinition
                                Width="7*" />
                            <ColumnDefinition
                                Width="1*" />
                            <ColumnDefinition
                                Width="1*" />
                        </Grid.ColumnDefinitions>
                        <Image
                            VerticalOptions="CenterAndExpand"
                            HorizontalOptions="CenterAndExpand"
                            HeightRequest="35"
                            WidthRequest="35"
                            Grid.Row="0"
                            Grid.Column="0"
                            Aspect="AspectFit"
                            Source="{Binding Icon}">
                        </Image>
                        <StackLayout
                            VerticalOptions="CenterAndExpand"
                            Spacing="0"
                            CompressedLayout.IsHeadless="true"
                            Margin="15,0,0,0"
                            Grid.Row="0"
                            Grid.Column="1">
                            <Label
                                VerticalTextAlignment="Start"
                                Text="{Binding Name}"
                                FontAttributes="Bold"
                                LineBreakMode="NoWrap"
                                Style="{DynamicResource ListItemTextStyle}"
                                FontSize="16" />
                            <Label
                                VerticalTextAlignment="Start"
                                Text="{Binding Description}"
                                LineBreakMode="NoWrap"
                                Style="{DynamicResource ListItemDetailTextStyle}"
                                FontSize="13" />
                        </StackLayout>
                        <Image
                            Grid.Row="0"
                            Grid.Column="3"
                            HeightRequest="20"
                            WidthRequest="20"
                            VerticalOptions="CenterAndExpand"
                            HorizontalOptions="StartAndExpand"
                            Aspect="AspectFit"
                            Source="{Binding Icon}" />
                        <Image
                            BackgroundColor="Lime"
                            Grid.Row="0"
                            Grid.Column="2"
                            InputTransparent="false"
                            Margin="0,0,10,0"
                            HeightRequest="20"
                            WidthRequest="20"
                            VerticalOptions="CenterAndExpand"
                            HorizontalOptions="StartAndExpand"
                            Aspect="AspectFit"
                            Source="ic_two">
                            <Image.GestureRecognizers>
                                <TapGestureRecognizer
                                    Command="{Binding OnFavouriteCommand}"
                                    CommandParameter="{Binding .}"
                                    NumberOfTapsRequired="1">
                                </TapGestureRecognizer>
                            </Image.GestureRecognizers>
                        </Image>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
Run Code Online (Sandbox Code Playgroud)

在我的 ViewModel 我有

public ICommand OnFavouriteCommand { get; set; }

public MyViewModel()
{           
  OnFavouriteCommand = new Command<Object>(OnFavourite);
}

void OnFavourite(Object ob)
{
  Debug.WriteLine(ob);
}
Run Code Online (Sandbox Code Playgroud)

我不Break Point介意OnFavourite。我不知道我在这里错过了什么?这个想法是在每个图像上附加一个手势识别器,并只传递绑定到该行的项目。

我刚刚注意到,如果我带

<Image
            BackgroundColor="Lime"
            Grid.Row="1"
            InputTransparent="false"
            Margin="0,0,10,0"
            HeightRequest="20"
            WidthRequest="20"
            VerticalOptions="CenterAndExpand"
            HorizontalOptions="StartAndExpand"
            Aspect="AspectFit"
            Source="ic_favourites">
            <Image.GestureRecognizers>
                <TapGestureRecognizer
                    Command="{Binding OnFavouriteCommand}"
                    CommandParameter="{Binding .}"
                    NumberOfTapsRequired="1">
                </TapGestureRecognizer>
            </Image.GestureRecognizers>
        </Image>
Run Code Online (Sandbox Code Playgroud)

ListView断点的外侧确实被击中了!。让我摸不着头脑... :|

Adi*_*ari 6

要在列表视图中使用手势,请像这样使用

<Image
    BackgroundColor="Lime"
    Grid.Row="1"
    InputTransparent="false"
    Margin="0,0,10,0"
    HeightRequest="20"
    WidthRequest="20"
    VerticalOptions="CenterAndExpand"
    HorizontalOptions="StartAndExpand"
    Aspect="AspectFit"
    Source="ic_favourites">
    <Image.GestureRecognizers>
        <TapGestureRecognizer
            Command="{Binding Binding Path=BindingContext.OnFavouriteCommand,Source={x:Reference root}}"
            CommandParameter="{Binding .}"
            NumberOfTapsRequired="1">
        </TapGestureRecognizer>
    </Image.GestureRecognizers>
</Image>
Run Code Online (Sandbox Code Playgroud)

这里 root 将是页面名称,如 set X:Name of your page is root like x:Name="root"


Pau*_*her 6

虽然 Adit 所写的是真实的,但让我为您提供一些背景知识。在 中DataTemplateBindingContext单元格(以及它们的子元素)的 没有设置BindingContext为父级(即ListView)的 ,而是为您ListView.ItemSource的单元格中的每个元素创建一个单元并将其BindingContext设置为该元素。否则,你将无法给的属性绑定ViewCell的孩子到你的领域,如IconNameDescription,等。

在 WPF 中,可以绑定到父级DataContext(参见此处),但 AFAIK 这在 Xamarin.Forms 中是不可能的(参见此处)。因此,您必须显式引用父级,即通过x:Name="Page"(或您想给它的任何名称)分配一个名称,然后通过Source绑定中的属性引用它

Command="{Binding Path=BindingContext.OnFavouriteCommand,Source={x:Reference Page}}"
Run Code Online (Sandbox Code Playgroud)

由于您设置的绑定源不是 the BindingContextof Page,而是 to Page,因此您必须将 the 添加BindingContex到路径中。此外,为了将由当前单元格表示的元素传递给命令,您必须设置

CommandParameter="{Binding .}"
Run Code Online (Sandbox Code Playgroud)

它绑定CommandParameter到单元格引用的元素(您已经这样做了)。