我有Xamarin表单解决方案,并在一个页面上有图像列表。当图像被单击时,我想触发程序which有图像路径作为参数。在xaml中,我定义图像:
<Image Source="{Binding ImagePath}"
WidthRequest="30" HeightRequest="30"
HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" >
<Image.GestureRecognizers>
<TapGestureRecognizer Command="{Binding TapImageCommand}" CommandParameter="{Binding ImagePath}" />
</Image.GestureRecognizers>
</Image>
TapImageCommand在视图模型的构造函数中定义为:
TapImageCommand = new Command<string>(ImagePath =>
{
OnImageTapped(ImagePath);
});
TapImageCommand的定义为:
public ICommand TapImageCommand { get; set; }
问题是从未触发OnImageTapped。我做错了什么?
2条答案
按热度按时间c9x0cxw01#
这里的问题是你 * 认为 * 你绑定的是列表后面的对象的
ImagePath
,但是你没有,看看你绑定的Command
,这是PageModel的一部分,不是列表中的对象,所以CommandParameter
也不是。因此,
ImagePath
很可能是null
,它与您为Command
所拥有的签名不匹配,该签名需要string
。在这种特殊情况下,最简单的方法可能是将整个对象作为参数提供,然后自己获取属性。我将假设列表中的对象是
Foo
类型,然后像下面这样编辑代码。在视图中,将
TapGestureRecognizer
编辑为:TapGestureRecognizer Command="{Binding TapImageCommand}" CommandParameter="{Binding .}" />
点指向自身,在本例中是列表中
Foo
的特定示例。然后编辑Command
,如下所示:现在,在
OnImageTapped
方法中,可以提取ImagePath
属性。zkure5ic2#
在我的情况下,我正在寻找堆栈布局或网格的选定索引,它是这样做的。
命令添加如下
在XAML上添加了命令