GestureRecognizers在ListView中不起作用

时间:2018-04-15 13:01:19

标签: c# xaml xamarin xamarin.forms

我有一个ListView如下

list(int x = 0, list* next = nullptr) : info(x), suivant(next) {}

tab.push_back(new list(x, nullptr));

在我的ViewModel中我有

<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>

public ICommand OnFavouriteCommand { get; set; } public MyViewModel() { OnFavouriteCommand = new Command<Object>(OnFavourite); } void OnFavourite(Object ob) { Debug.WriteLine(ob); } 没有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> 的外侧确实受到了打击!让我挠挠脑袋......:

2 个答案:

答案 0 :(得分:2)

要在listview中使用手势,请使用

<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>

这里的root将是页面名称,如集合X:您的页面名称是x的根:名称=“root”

答案 1 :(得分:2)

虽然Adit写的是真的,但是让我给你一些背景知识。在DataTemplate内,单元格的BindingContext(以及它们的子节点)未设置为父级的BindingContext(即ListView),但是创建ListView.ItemSource单元格中的每个元素,并将其BindingContext设置为该元素。否则,您将无法将ViewCell个孩子的属性绑定到IconNameDescription等字段。

在WPF中,有可能绑定到父DataContext(参见here),但AFAIK在Xamarin.Forms中是不可能的(参见here)。因此,您必须明确引用父级,即通过x:Name="Page"(或您希望提供的任何名称)指定名称,然后通过Source属性引用它。你的约束力

Command="{Binding Path=BindingContext.OnFavouriteCommand,Source={x:Reference Page}}"

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

BindingContex

CommandParameter="{Binding .}" 绑定到单元格引用的元素(您已经执行过)。