如何在ListView的ItemClick事件中获取点击项的GameID
解决ListView ItemClick事件中获取GameID的问题
嘿,我明白你现在遇到的困扰了——在ListView的点击事件里没法正确拿到目标游戏的GameID,对吧?咱们直接来解决这个问题:
核心解决方案:对ClickedItem进行类型转换
你的ListView绑定的是ObservableCollection<GameListObject>,所以e.ClickedItem本质上就是GameListObject的实例,根本不需要用ToString()方法(那只会返回类的名称)。你只需要把它强转为对应的类型,就能直接获取GameID了。
修改后的ItemClick方法代码如下:
private void gamehub_list_ItemClick(object sender, ItemClickEventArgs e) { // 用is运算符安全地进行类型检查和转换 if (e.ClickedItem is GameListObject selectedGame) { long targetGameId = selectedGame.GameID; Debug.WriteLine("点击的游戏ID:" + targetGameId); // 这里就可以使用targetGameId跳转到新页面,请求对应游戏的数据了 } }
为什么索引会返回-1?
你设置了SelectionMode="None",这意味着ListView不会维护任何选中项的状态,所以SelectedIndex自然会返回-1,这是完全正常的设计行为。所以不要试图通过索引去获取数据,直接使用ClickedItem才是正确的做法。
额外的代码优化建议
在你的gamehub_search_TextChanged方法里,你循环创建了新的GameListObject实例并添加到新集合里,这其实是多余的。你可以直接把反序列化后的集合转成ObservableCollection作为ItemsSource:
// 替换原来的foreach循环和GameList创建逻辑 var gamelistobjects = JsonSerializer.Deserialize<List<GameListObject>>(httpResponseBody); ObservableCollection<GameListObject> gameList = new ObservableCollection<GameListObject>(gamelistobjects); gamehub_list.ItemsSource = gameList;
这样不仅代码更简洁,还能保留每个GameListObject的完整数据(比如ReleaseDates),后续如果需要用到其他属性也会更方便。
内容的提问来源于stack exchange,提问作者ThatGuyJacobee
相关产品推荐
相关产品推荐

