<CollectionView.ItemTemplate>
<DataTemplate x:DataType="data:PhotoItemViewModel">
<Border StrokeThickness="1"
Padding="0">
<VerticalStackLayout>
<Grid>
<Image
Source="{Binding ThumbnailImageSource}"
Aspect="AspectFill"
HeightRequest="120"
WidthRequest="120">
<Image.Behaviors>
<toolkit:TouchBehavior
LongPressCommand="{Binding x:DataType=ContentPage, Source={x:Reference Page}, Path=BindingContext.LongPressCommand}"
LongPressCommandParameter="{Binding .}"/>
</Image.Behaviors>
</Image>
<CheckBox
IsChecked="{Binding IsSelected}"
IsVisible="{Binding x:DataType=ContentPage,Source={x:Reference Page}, Path=BindingContext.IsSelectionMode}"
VerticalOptions="Start"
HorizontalOptions="End"
Margin="5"
BackgroundColor="White"
Opacity="0.8"/>
</Grid>
</VerticalStackLayout>
</Border>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
Here I'm using a collection view to display a list of images, with the support of long press gesture on each image, implemented using CommunityToolkit.Maui's TouchBehavior. And my view model's LongPressCommand
command is initialized with this method:
private void OnPhotoLongPressed(PhotoItemViewModel photo)
{
IsSelectionMode = true;
// photo.IsSelected = true;
}
Now the issue is the photo
passed from the command is always null.
Turns out there're just couple of things to add in order to have my original code to work:
Add BindingContext
assignment to the behavior;
Set x:DataType
to the BindingContext
;
Use x:Reference
to refer to the parent Image
control and set its BindingContext
to the behavior.
Hope this could be added to the documentation as this is quite a common scenario.