GestureRecognizers не работает внутри ListView

У меня есть 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>

и в моей ViewModel у меня есть

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>

За пределами ListView точка останова действительно достигается !. Оставил меня чесать затылок ...: |

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
2 272
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Чтобы работать с жестом в списке, используйте этот

<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: Name = "root"

Спасибо, Adit, расширил модель и добавил свойство Command.

envyM6 19.04.2018 16:23

Хотя то, что написал Адит, верно, позвольте мне дать вам некоторую предысторию. В DataTemplateBindingContext ячеек (и, следовательно, их потомков) не настроен на BindingContext родительского (то есть ListView), но для каждого элемента из вашего ListView.ItemSource создается ячейка, и ее BindingContext устанавливается на это элемент. В противном случае вы не сможете привязать свойства дочерних элементов ViewCell к своим полям, таким как Icon, Name, Description и т. д.

В WPF есть возможность привязать к родительскому DataContext (см. здесь), но AFAIK это невозможно в Xamarin.Forms (см. здесь). Поэтому вам нужно будет явно ссылаться на родителя, т.е. назначить имя через x:Name = "Page" (или любое другое имя, которое вы хотите дать ему), а затем ссылаться на него через свойство Source в вашей привязке

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

Поскольку вы устанавливаете источник привязки не BindingContextPage, а Page, вам нужно будет добавить BindingContex в путь. Кроме того, чтобы передать элемент, представленный текущей ячейкой, команде, вам необходимо установить

CommandParameter = "{Binding .}"

который привязывает CommandParameter к элементу, на который ссылается ячейка (что вы уже сделали).

Привет, Пол. Спасибо за предысторию. В итоге я расширил модель и добавил свойство команды.

envyM6 19.04.2018 16:22

Другие вопросы по теме