Xamarin.Forms ListView中ItemTapped与ItemSelected事件触发异常咨询
为什么Xamarin.Forms ListView会先触发ItemTapped再触发ItemSelected?
哈哈,这个问题其实是Xamarin.Forms ListView的事件触发逻辑设计导致的,我帮好几个开发者解答过类似的疑问~
咱们先拆解一下这两个事件的触发时机:
- ItemTapped:只要用户对ListView的项完成了“点击(轻触)”这个动作,就会立即触发它——它只关心“点击动作”本身,不管这个项之前有没有被选中。
- ItemSelected:它是当项的选中状态发生变化时才会触发。比如你点击一个原本未被选中的项,系统会先完成“点击”动作触发ItemTapped,接着把这个项标记为“选中”状态,状态变化的瞬间就会触发ItemSelected。
所以你看到的现象完全符合预期:点击未选中的项时,先弹出“You tapped item”(ItemTapped触发),紧接着项被选中,触发ItemSelected弹出“You selected item”。
如果想避免这种两次弹窗的情况,给你几个实用的解决方案:
- 二选一使用事件:如果你的需求只是“响应选中操作”,直接用ItemSelected就够了;如果只需要“响应点击动作”,只用ItemTapped就行,没必要同时绑定两个。
- 在ItemTapped中取消选中状态:如果必须同时保留两个事件的逻辑,可以在Tapped的处理方法里手动清空选中项,这样就不会触发ItemSelected了,示例代码:
private void Tapped(object sender, ItemTappedEventArgs e) { DisplayAlert("提示", "You tapped item", "确定"); // 取消选中状态,阻断ItemSelected的触发 listView.SelectedItem = null; }
- 在ItemSelected中做判断:如果只想在“选中新项”时弹窗,可以判断选中项不为null时再执行逻辑,甚至可以在执行后清空选中状态,方便下次点击:
private void Select(object sender, SelectedItemChangedEventArgs e) { if (e.SelectedItem != null) { DisplayAlert("提示", "You selected item", "确定"); // 可选:清空选中状态,下次点击同一项也能重新触发 listView.SelectedItem = null; } }
内容的提问来源于stack exchange,提问作者Noor Allan
相关产品推荐
相关产品推荐

