如何将参数传递给命令

Uro*_*ros 2 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>
Run Code Online (Sandbox Code Playgroud)

和TapImageCommand在视图模型的构造函数中定义为:

TapImageCommand = new Command<string>(ImagePath =>
{
    OnImageTapped(ImagePath);
});
Run Code Online (Sandbox Code Playgroud)

和TapImageCommand定义为:

public ICommand TapImageCommand { get; set; }
Run Code Online (Sandbox Code Playgroud)

问题是永远不会触发OnImageTapped.我究竟做错了什么?

Ger*_*uis 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);
});
Run Code Online (Sandbox Code Playgroud)

现在,在您的OnImageTapped方法中,您可以提取ImagePath属性.