Xamarin中获取CollectionView点击项索引的方法求助
解决CollectionView点击项获取索引的问题
这里有两种实用的方法可以实现点击项时获取索引的需求:
方法1:通过BindingContext获取数据对象后计算索引
直接修改你的点击事件处理代码,借助点击元素的BindingContext拿到当前绑定的Agent数据,再从集合中定位索引:
async void OnTapGestureRecognizerTapped(object sender, EventArgs args) { // 从点击的Grid中提取绑定的数据对象 var tappedAgent = (sender as Grid)?.BindingContext as Data; if (tappedAgent == null) return; // 获取该项在集合中的索引 int agentIndex = Agents.IndexOf(tappedAgent); // 传递数据和索引到详情页 await ExecuteNavigateToDetailPageCommand(Agents, agentIndex); } private async Task ExecuteNavigateToDetailPageCommand(ObservableCollection<Data> data, int selectedIndex) { await Navigation.PushAsync(new ValorantApp.Views.DetailPage(data, selectedIndex)); }
补充说明
如果存在数据重复的可能(虽然Valorant Agent不会出现这种情况),建议通过Agent的唯一ID来精准定位索引,避免IndexOf返回错误结果:
int agentIndex = Agents.ToList().FindIndex(agent => agent.id == tappedAgent.id);
方法2:使用CollectionView原生的SelectionChanged事件
替换手动添加的TapGesture,改用CollectionView的原生选择事件,更贴合控件设计逻辑:
- 修改XAML中的CollectionView配置,添加选择模式和选择事件:
<CollectionView x:Name="lvwAgents" Grid.Row="5" Grid.ColumnSpan="2" HorizontalScrollBarVisibility="Never" Margin="0,-25,-75,0" SelectionMode="Single" SelectionChanged="OnAgentSelectionChanged">
- 在后台实现选择事件处理逻辑:
private async void OnAgentSelectionChanged(object sender, SelectionChangedEventArgs e) { // 获取选中的Agent数据 var selectedAgent = e.CurrentSelection.FirstOrDefault() as Data; if (selectedAgent == null) return; // 获取索引 int agentIndex = Agents.IndexOf(selectedAgent); // 跳转到详情页 await ExecuteNavigateToDetailPageCommand(Agents, agentIndex); // 取消选中状态,避免重复点击同一项无响应 lvwAgents.SelectedItem = null; }
两种方法都能满足你的需求,可根据自身代码习惯选择使用。
内容的提问来源于stack exchange,提问作者ThibautDT
相关产品推荐
相关产品推荐

