У меня есть 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 точка останова действительно достигается !. Оставил меня чесать затылок ...: |





Чтобы работать с жестом в списке, используйте этот
<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"
Хотя то, что написал Адит, верно, позвольте мне дать вам некоторую предысторию. В 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 к элементу, на который ссылается ячейка (что вы уже сделали).
Привет, Пол. Спасибо за предысторию. В итоге я расширил модель и добавил свойство команды.
Спасибо, Adit, расширил модель и добавил свойство Command.