TapGestureRecognizer在ListView中不起作用

时间:2019-06-24 15:01:01

标签: listview xamarin.forms

我正在Xamarin.Forms页面上工作,该页面显示使用MVVM模式的项目列表。

我无法获得工作的列表项的TapGestureRecognizer对象的Command属性。无论我尝试什么,它都不会开火。 对于所有的listview元素,此命令属性应引用VM上的单个ICommand属性。 CommandParameter属性应根据其ID在元素之间进行选择。

点击事件似乎正在运行。我不确定Command属性与VM的数据绑定是否错误或Xamarin.Forms在此处是否存在错误。

我曾尝试过将TapGestureRecognizer的Command属性绑定到ViewModel的数据的其他设置,并且还在嵌套View元素上使用了InputTransparent属性。这里没有变化:命令不会触发

查看XAML标头:

<ContentPage ...
             x:Class="Ch9.MainPage2"
             x:Name="page"
             >

视图具有ViewModel属性,即viewmodel:

public partial class MainPage2 : ContentPage
{
    public MainPage2ViewModel ViewModel
    {
       get => BindingContext as MainPage2ViewModel;
       set => BindingContext = value;
    }

        public MainPage2()
        {
            InitializeComponent();
            ViewModel = new MainPage2ViewModel(
            ...injecting components...
             );
        }
}

viewmodel具有ItemTappedCommand属性:

public ICommand ItemTappedCommand { get; private set; }
...
ItemTappedCommand = new Command<int>(async id => await OnItemTappedCommand(id));

在页面内部,我具有一个stacklayout作为content-root,并且在stacklayout内部有一个listview。为了使代码小,我省略了我认为不相关的

<ListView
    ItemsSource="{Binding SearchResults}">
    <ListView.ItemTemplate>
    <DataTemplate>                        
        <ViewCell>
            <StackLayout>
                <StackLayout.GestureRecognizers>
                      <TapGestureRecognizer 
                            BindingContext="{x:Reference page}"                                        
                            Command="{Binding Path=ViewModel.ItemTappedCommand}" CommandParameter="{Binding Id}"  NumberOfTapsRequired="1"/>
                </StackLayout.GestureRecognizers>

                                <Image InputTransparent="True">
                                    <Image.Source>
                                        <UriImageSource Uri="{Binding ImgSmSrc}"
                                                    CacheValidity="0"
                                                    CachingEnabled="False"                                                    
                                                    />
                                    </Image.Source>
                                </Image>
                               <StackLayout InputTransparent="True">
                              some content...
                              </StackLayout>

                            </StackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>

1 个答案:

答案 0 :(得分:0)

您已将TapGestureRecognizer的{​​{1}}更改为当前内容页面,但是它无法注意到自定义的已定义属性BindingContext,只能使用ViewModel的财产。

因此ContentPage此绑定将失败。

我建议您像这样调整绑定力:

{Binding Path=ViewModel.ItemTappedCommand}

<ListView x:Name="listView" ItemsSource="{Binding SearchResults}" HasUnevenRows="True"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <StackLayout> <StackLayout.GestureRecognizers> <TapGestureRecognizer Command="{Binding Path= BindingContext.ItemTappedCommand, Source={x:Reference listView}}" CommandParameter="{Binding Id}" NumberOfTapsRequired="1"/> </StackLayout.GestureRecognizers> <!--onther stuff--> <!--...--> </StackLayout> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> 的绑定上下文是您的视图模型,已使用后面的代码进行设置。最后,您可以在那里消费listView

此外,当您要访问ID时,我只更改了ItemTappedCommand的{​​{1}}而不是整个手势的绑定上下文。否则,您将不会检索它,因为它属于Command的元素,而不是查看模型本身。