如何将参数传递给命令

时间:2017-04-03 09:02:39

标签: xamarin xamarin.forms

我有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。我做错了什么?

1 个答案:

答案 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属性。