使用命令参数点击手势

时间:2019-11-17 00:32:13

标签: forms xamarin commandparameter

我有一个列表视图,其中的ItemTemplate定义如下:

for (Message message = null; message < messages.length; message++) {...}

我在文件后面的代码按如下方式处理OnDelete_Tapped:

<ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="0.7*" />
                                    <ColumnDefinition Width="0.3*" />
                                </Grid.ColumnDefinitions>
                                <Label Text="{Binding AddressTypeName}" Grid.Column="0"/>
                                <Label Text="&#xE74D;"
                                       Grid.Column="1"
                                       FontFamily="{StaticResource SegoeMDL2Assets}" FontSize="Medium" HorizontalOptions="End">
                                    <Label.GestureRecognizers>
                                        <TapGestureRecognizer Tapped="OnDelete_Tapped" CommandParameter="{Binding .}"/>
                                    </Label.GestureRecognizers>
                                </Label>

                            </Grid>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>

            </ListView.ItemTemplate>

EventArgs e确实返回了其中包含正确对象(在我的情况下为正确的AddressType对象)的EventArgs对象。

ViewModel定义如下:

      public void OnDelete_Tapped(object sender, EventArgs e)
    {
        viewModel.DeleteCommand.Execute(e);

        viewModel.LoadAddressTypesCommand.Execute(true);
    }

从不执行DeleteCommand。我可以单步执行代码,但是从不调用viewModel中的DeleteCommand。 LoadAddressTypesCommand可以正常运行-不仅是从后面的代码中,而且在其他地方,我都将该命令作为命令绑定到了我的viewModel。有什么想法我做错了吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

在xaml中:

<TapGestureRecognizer Tapped="OnDelete_Tapped" CommandParameter="{Binding .}"/>

然后e.Parameter将是您在CommandParameter中设置的任何内容。

public void OnDelete_Tapped(object sender, TappedEventArgs e)
{
    var addressType = (e.Parameter) as AddressType;
    viewModel.DeleteCommand.Execute(addressType );
    viewModel.LoadAddressTypesCommand.Execute(true);
}

或直接Using ICommand

<TapGestureRecognizer
        Command="{Binding DeleteCommand}"
        CommandParameter="{Binding .}" />