我在collectionview中有stacklayout,我想点击stacklayout元素来执行绑定命令。当我添加TapGestureRecognizer到stacklayout - stacklayout停止响应触摸(我仍然可以滚动它)和绑定命令不触发:
<CollectionView ItemsSource="{Binding ResponseResponses}" SelectionMode="Single" >
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout>
<StackLayout.GestureRecognizers>
<TapGestureRecognizer Command="{Binding SearchCommand}" NumberOfTapsRequired="1"/>
</StackLayout.GestureRecognizers>
<Label Text="{Binding Username, StringFormat=User: {0}}" />
<Label Text="{Binding FileCount, StringFormat=Files: {0}}" />
<BoxView HeightRequest="1"
BackgroundColor="LightGray"
VerticalOptions="End"/>
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
所以没有GestureRecognizers——在stacklayout元素上的选择可以工作,有了gesturerecognizer——就不行。如果我将gesturerecognizer添加到标签(例如),那么触摸就会在该标签上受阻。
Btw {Binding SearchCommand}是自己工作的,它被绑定到视图中的其他按钮,所以可能没有原因。
那么,我这里做错了什么?
所以,正如我在这里发现的:CollectionView提示
请记住,当在ItemTemplate中工作时,BindingContext是项目本身,而不是ContentPage的。如果您的命令在项目上存在,那么您就万事俱备了。但是,如果你希望将这个绑定路由到ContentPage视图模型上的命令,就像这个例子中一样,你可以使用新支持的RelativeSource。
所以你必须使用这样的绑定:
<CollectionView.ItemTemplate>
<DataTemplate>
<views:ResultViewA>
<views:ResultViewA.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding
Source={RelativeSource
AncestorType={x:Type vm:FlightResultsViewModel}},
Path=GoToDetailsCommand}"
CommandParameter="{Binding .}"/>
</views:ResultViewA.GestureRecognizers>
</views:ResultViewA>
</DataTemplate>
</CollectionView.ItemTemplate>
在我的例子中,它现在看起来像这样:
<StackLayout>
<StackLayout.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding
Source={RelativeSource
AncestorType={x:Type viewmodels:SearchViewModel}},
Path=SearchCommand}"
CommandParameter="{Binding .}"/>
</StackLayout.GestureRecognizers>
<Label Text="{Binding Username, StringFormat=User: {0}}"/>
<Label Text="{Binding FileCount, StringFormat=Files: {0}}"/>
<BoxView HeightRequest="1"
BackgroundColor="LightGray"
VerticalOptions="End" InputTransparent="True"/>