我有Xamarin Forms解决方案,在一个页面上有图像列表。单击图像时,我想触发具有图像路径作为参数的程序。在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。我做错了什么?
答案 0 :(得分:6)
这里的问题是你认为你绑定了列表后面对象的ImagePath
,但你不是。查看您绑定的Command
,这是PageModel的一部分,而不是列表中的对象,因此CommandParameter
也不是。
因此,ImagePath
可能是null
,与Command
所需的签名不匹配string
。
在这种特殊情况下,最简单的方法是将整个对象作为参数提供,并自行获取属性。我假设列表中的对象是Foo
类型,然后编辑你的代码,如下面。
在您视图中,将TapGestureRecognizer
编辑为:
TapGestureRecognizer Command="{Binding TapImageCommand}" CommandParameter="{Binding .}" />
点指向自身,在这种情况下是列表中Foo
的特定实例。然后像这样编辑Command
:
TapImageCommand = new Command<Foo>(fooObject =>
{
OnImageTapped(fooObject);
});
现在,在您的OnImageTapped
方法中,您可以提取ImagePath
属性。