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

Xamarin Forms:Picker获焦时加载Itemsource首次不生效问题求助

解决Picker首次聚焦时ItemsSource未加载的问题

我来帮你分析下这个问题,然后给出几个可行的解决思路:

问题根源分析

你的代码里提前赋值了itmSrc = Controls[i].ItemSource,但大概率是首次触发Focused事件时,Controls[i].ItemSource还没完成数据加载,导致itmSrc是空的;另外,Focused事件的触发时机可能早于Picker控件完全初始化的时间,这时候直接赋值ItemsSource可能不会被UI正确识别。


可行解决方案

方案1:聚焦时实时获取数据源

不要提前缓存数据源,而是在Focused事件触发时实时获取,确保拿到的是已经加载完成的数据:

Picker picker = new Picker(); 
picker.Focused += BindItemSourceOnFocus; 

public void BindItemSourceOnFocus(object sender, FocusEventArgs e) 
{
    var p = e.VisualElement as Picker;
    // 实时拉取最新的数据源,避免提前赋值时数据未就绪
    var itmSrc = Controls[i].ItemSource;
    // 先清空再赋值,强制UI刷新
    p.ItemsSource = null;
    p.ItemsSource = itmSrc;
}

方案2:结合Loaded事件确保控件就绪

先等Picker完全加载完成后再绑定Focused事件,避免控件未初始化导致赋值无效:

Picker picker = new Picker();
bool isFirstLoad = true;

// 先监听控件加载完成事件
picker.Loaded += (s, e) => 
{
    // 控件就绪后再绑定焦点事件
    picker.Focused += BindItemSourceOnFocus;
};

public void BindItemSourceOnFocus(object sender, FocusEventArgs e) 
{
    var p = sender as Picker;
    // 只在首次聚焦时加载数据
    if (isFirstLoad)
    {
        var itmSrc = Controls[i].ItemSource;
        p.ItemsSource = itmSrc;
        isFirstLoad = false;
    }
}

方案3:异步加载场景适配(如果数据来自网络/异步操作)

如果你的数据源是通过异步方法获取的,一定要在Focused事件里异步等待数据加载完成:

Picker picker = new Picker();
bool hasLoaded = false;

picker.Focused += async (s, e) => 
{
    if (hasLoaded) return;
    
    var p = s as Picker;
    // 假设GetItemSourceAsync是你的异步数据获取方法
    var itmSrc = await Controls[i].GetItemSourceAsync();
    p.ItemsSource = itmSrc;
    hasLoaded = true;
};

额外注意事项

  • 确保Controls[i].ItemSource的数据源集合实现了INotifyCollectionChanged(比如用ObservableCollection<T>替代普通List<T>),这样UI才能自动感知数据变化
  • 如果是MAUI/Xamarin.Forms,赋值后可以尝试调用p.ForceLayout()强制刷新控件布局
  • 可以在调试时打印itmSrc的Count,确认数据是否真的已经加载

内容的提问来源于stack exchange,提问作者Mohammed Ameen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:38:54