如何使用MVVM在xamarin listview中添加多个命令按钮?

时间:2017-09-15 20:05:12

标签: xaml listview xamarin

我正在尝试创建一个列表视图,用户可以在其中选择列表项以查看商店,也可以单击图像将其带到产品详细信息中。 如何在ViewCell中添加命令?

    <ListView ItemsSource="{Binding myData}" x:Name="myListView" SelectedItem="{Binding SelectedStore}" > 
<ListView.ItemTemplate>
    <DataTemplate> 
        <ViewCell>  
        <Grid>    
              <Label Text="{Binding Title}" /> 
              <Image Source="product.png" >
                    <Image.GestureRecognizers>
                         <TapGestureRecognizer Command="{Binding ItemTapCommand}" CommandParameter="Id" />
                    </Image.GestureRecognizers>
                </Image> 
           </Grid>
        </ViewCell>
    </DataTemplate>
</ListView.ItemTemplate>


    public ICommand ItemTapCommand => new Command(ShowSelectedProductAsync());

    private async Task ShowSelectedProductAsync()
    {
      //take them to view the item detail
    }

1 个答案:

答案 0 :(得分:1)

问题是您正在尝试绑定到不在ListView中的单个项目上的命令; Image上的BindingContext是myData集合中的各个项目。

使用其他框架,例如Wpf,您只需使用绑定的RelativeSource部分来告诉控件在另一个控件的BindingContext上查找您的命令,但是在Xamarin Forms中这是不可能的(不支持RelativeSource)。

您可以执行以下操作,但它需要您的UserControl拥有x:Name

<TapGestureRecognizer Command="{Bindind Path=BindingContext.ItemTapCommand,
                                        Source={x:Reference MyUserControl}}"
                      CommandParameter="{Binding Id}" />

这就是使用UserControl作为绑定的源,该属性是由BindingContext.ItemTapCommand组成的UserControl的嵌套属性。

作为奖励,我更新了代码,因为我觉得您可能想要将每个记录的Id属性的值绑定为命令参数,而不仅仅是将字符串“Id”作为命令参数发送。 / p>