如何处理CollectionView同一元素的二次点击问题?
解决方案
问题1:再次点击同一元素时SelectionChanged不触发
默认SelectionMode="Single"下,选中元素后再次点击同一元素,由于SelectedItem未发生变化,SelectionChanged不会触发。可通过以下两种方式解决:
方式1:处理逻辑后重置选中项
在SelectionChanged事件处理方法中,完成业务逻辑后手动将绑定的SelectedPlayer设为null,让下次点击同一元素时,SelectedItem从null切换为目标元素,从而触发SelectionChanged:
private void CollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e) { var selectedPlayer = e.CurrentSelection.FirstOrDefault() as Player; if (selectedPlayer == null) return; // 执行你的业务逻辑 // ... // 重置选中项,允许再次触发SelectionChanged ViewModel.SelectedPlayer = null; }
方式2:改用ItemTapped事件
CollectionView的ItemTapped事件会在每次点击元素时触发,无论是否为当前选中元素,直接绑定该事件即可处理二次点击:
<CollectionView ItemsSource="{Binding Players}" SelectedItem="{Binding SelectedPlayer}" ItemTapped="CollectionView_ItemTapped" SelectionMode="Single"> <!-- 原有模板内容 --> </CollectionView>
后台处理代码:
private void CollectionView_ItemTapped(object sender, ItemTappedEventArgs e) { var tappedPlayer = e.Item as Player; if (tappedPlayer == null) return; // 处理点击逻辑,每次点击都会执行 // ... }
问题2:添加TapGestureRecognizer后SelectionChanged失效
手势识别器默认会拦截点击事件,导致CollectionView无法接收选择事件。只需给TapGestureRecognizer设置CancelsTouchesInView="False",让事件继续传递给CollectionView,即可同时触发手势和SelectionChanged:
<local:PlayerTile.GestureRecognizers> <TapGestureRecognizer Tapped="OnTapped" CancelsTouchesInView="False" /> </local:PlayerTile.GestureRecognizers>
这样既保留手势功能,又不影响CollectionView的选择事件,无需将SelectionChanged的逻辑迁移到OnTapped中。
内容的提问来源于stack exchange,提问作者Vitaly Filatenko
相关产品推荐
相关产品推荐

