.NET MAUI中ListView SelectedItem为null问题(OnAppearing刷新时)
问题根源
你在OnAppearing中调用InitializeComponent()的做法是错误的——这个方法仅应在页面构造函数中调用一次,作用是初始化页面的UI控件实例。重复调用会重建整个页面的所有UI元素(包括两个ListView),导致原有的控件状态、事件绑定全部失效,这就是选中项返回null的核心原因:你操作的是新创建的ListView实例,而非页面首次加载时的实例,其SelectedItem逻辑无法正常工作。
解决方案
1. 使用ObservableCollection自动刷新UI(推荐)
将ListHolder.GadgetList的类型从普通List<Gadget>改为ObservableCollection<Gadget>。ObservableCollection会在集合添加/删除元素时自动通知UI更新,无需手动刷新ListView:
// 修改ListHolder中的集合定义 public static ObservableCollection<Gadget> GadgetList { get; } = new ObservableCollection<Gadget>();
之后无需在OnAppearing中做任何额外操作,从其他页面返回时,ListView会自动显示新添加的Gadget,同时SelectedItem功能完全正常。
2. 手动刷新ItemsSource(若无法改用ObservableCollection)
如果必须使用普通List,在OnAppearing中重新赋值ListView的ItemsSource,触发UI刷新的同时保留原有控件实例:
protected override void OnAppearing() { base.OnAppearing(); // 先设为null再重新赋值,强制ListView刷新 operatorGadgetsListView2.ItemsSource = null; operatorGadgetsListView2.ItemsSource = local:ListHolder.GadgetList; // 对另一个未命名的ListView执行同样操作 yourFirstListViewName.ItemsSource = null; yourFirstListViewName.ItemsSource = local:ListHolder.GadgetList; }
3. 恢复base.OnAppearing()调用
不要注释掉base.OnAppearing();,这是页面生命周期的必要调用,确保页面正常执行生命周期逻辑。
额外检查
确保你的ListViewSelectionChanged事件处理逻辑正确,示例如下:
private void ListViewSelectionChanged(object sender, SelectedItemChangedEventArgs e) { if (e.SelectedItem is Gadget selectedGadget) { // 处理选中项的业务逻辑 } // 可选:清除选中状态,避免重复触发事件 ((ListView)sender).SelectedItem = null; }
内容的提问来源于stack exchange,提问作者iamanoob
相关产品推荐
相关产品推荐

