我正在尝试创建一个列表视图,用户可以在其中选择列表项以查看商店,也可以单击图像将其带到产品详细信息中。 如何在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
}
答案 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>