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

.NET MAUI Picker获取Firebase数据后ItemsSource不更新问题(Windows)

问题解决:Windows平台下Picker无法更新Firebase获取的物料列表

核心问题分析

  1. 绑定路径拼写错误:XAML中Picker的ItemsSource绑定了Material,但ViewModel中定义的ObservableCollection属性是Materials(复数形式),导致绑定失效。
  2. 后台线程更新UI集合:使用Task.Run在后台线程直接修改ObservableCollection,而UI控件的集合更新必须在主线程执行,否则无法触发UI刷新。
  3. 异步操作的线程上下文错误:未正确处理异步获取数据后的UI线程切换逻辑。

分步解决方案

1. 修正XAML绑定路径

将Picker的ItemsSource绑定改为正确的Materials:

<Picker x:Name="rawMaterialPicker" Grid.Row="0" Grid.Column="1" HorizontalOptions="End"  
        ItemsSource="{Binding Materials}" 
        SelectedItem="{Binding ManufacturingStep.RawMaterial}">
    <Picker.ItemDisplayBinding>
        <Binding Path="MaterialDescription" />
    </Picker.ItemDisplayBinding>
</Picker>

2. 正确处理异步数据获取与UI更新

修改页面的OnNavigatedTo方法,直接使用异步模式(页面生命周期方法允许async void),确保集合更新在主线程执行:

protected override async void OnNavigatedTo(NavigatedToEventArgs args)
{
    // 直接在异步方法中获取数据,无需额外Task.Run
    var materials = await DBConnection.materialHandler.GetAll();
    
    // 清空原有数据并添加新物料
    viewModel.Materials.Clear();
    foreach (var material in materials)
    {
        viewModel.Materials.Add(material);
    }

    base.OnNavigatedTo(args);
}

如果必须在后台线程获取数据(比如数据量较大),则需要手动切换回主线程更新集合:

protected override void OnNavigatedTo(NavigatedToEventArgs args)
{
    _ = Task.Run(async () => 
    {
        // 后台线程获取数据
        var materials = await DBConnection.materialHandler.GetAll();
        
        // 切换到主线程更新UI集合
        MainThread.BeginInvokeOnMainThread(() => 
        {
            viewModel.Materials.Clear();
            foreach (var material in materials)
            {
                viewModel.Materials.Add(material);
            }
        });
    });

    base.OnNavigatedTo(args);
}

3. 确认ViewModel的ObservableProperty配置

确保使用CommunityToolkit.Mvvm的[ObservableProperty]特性,它会自动生成符合INotifyPropertyChanged的属性:

using CommunityToolkit.Mvvm.ComponentModel;
using System.Collections.ObjectModel;

public partial class CreateManufacturingStepViewModel : ObservableObject
{
    [ObservableProperty]
    ObservableCollection<Material> materials;

    public CreateManufacturingStepViewModel()
    {
        Materials = new ObservableCollection<Material>();
    }
}

额外检查项

  • 确认DBConnection.materialHandler.GetAll()确实返回了非空的物料集合。
  • 确保ManufacturingStep.RawMaterial的类型与Material一致,且Material类正确实现了Equals方法(影响SelectedItem的匹配逻辑)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:48:23