.NET MAUI Picker获取Firebase数据后ItemsSource不更新问题(Windows)
问题解决:Windows平台下Picker无法更新Firebase获取的物料列表
核心问题分析
- 绑定路径拼写错误:XAML中Picker的
ItemsSource绑定了Material,但ViewModel中定义的ObservableCollection属性是Materials(复数形式),导致绑定失效。 - 后台线程更新UI集合:使用
Task.Run在后台线程直接修改ObservableCollection,而UI控件的集合更新必须在主线程执行,否则无法触发UI刷新。 - 异步操作的线程上下文错误:未正确处理异步获取数据后的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
相关产品推荐
相关产品推荐

