You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:25:33