xamarin 如何向命令传递参数

qf9go6mv  于 2022-12-25  发布在  其他
关注(0)|答案(2)|浏览(170)

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

c9x0cxw0

c9x0cxw01#

这里的问题是你 * 认为 * 你绑定的是列表后面的对象的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属性。

zkure5ic

zkure5ic2#

在我的情况下,我正在寻找堆栈布局或网格的选定索引,它是这样做的。
命令添加如下

public ICommand SelectedItem
{
    get
    {
        return new Command<string>((x) => OpenChild(x));
    }
}
public void OpenChild(string x)
{
    //handle parameter x to say "Hello " + x
}

在XAML上添加了命令

SelectionChangedCommand="{Binding SelectedItem}" SelectionChangedCommandParameter="{Binding SelectedItem, Source={RelativeSource Self}}

相关问题