.NET MAUI Picker绑定上下文后无法自动更新问题求助
问题根源
你在后台代码中直接给Picker的ItemsSource赋值为ViewModel初始的TestDataList实例,当API请求完成后,你替换了TestDataList的整个实例,但Picker的ItemsSource仍指向原来的空集合引用,因此无法自动更新UI。
解决方法
方案1:改用XAML绑定ItemsSource
通过XAML将Picker的ItemsSource绑定到ViewModel的TestDataList属性,这样当TestDataList的实例变更并触发PropertyChanged事件时,Picker会自动更新。
修改XAML代码:
<VerticalStackLayout Padding="5"> <Label HorizontalOptions="CenterAndExpand" Text="Test History" FontSize="Header"/> <Picker Title="Select Filename" ItemsSource="{Binding TestDataList}" ItemDisplayBinding="{Binding FileName}"/> </VerticalStackLayout>
移除后台代码中手动赋值的逻辑:
public partial class TestHistoryView : ContentView { public TestHistoryView(TestHistoryViewModel viewModel) { BindingContext = viewModel; InitializeComponent(); // 移除以下两行手动赋值代码 // FileNamePicker.ItemsSource = (BindingContext as TestHistoryViewModel).TestDataList; // FileNamePicker.ItemDisplayBinding = new Binding("FileName"); } }
方案2:不替换ObservableCollection实例,更新原有集合
保持TestDataList的实例不变,清空原有数据后添加新数据,利用ObservableCollection自带的CollectionChanged事件自动通知UI更新。
修改ViewModel中的GetAllTestDataAsync方法:
private async void GetAllTestDataAsync() { TestDataAPIService testDataAPIService = new TestDataAPIService(); var testDataList = await testDataAPIService.GetAllTestData(); // 清空原有集合并添加新数据,无需替换整个实例 TestDataList.Clear(); foreach (var data in testDataList) { TestDataList.Add(data); } }
额外优化:ViewModel明确实现INotifyPropertyChanged接口
让ViewModel类明确实现接口,代码更规范:
public class TestHistoryViewModel : INotifyPropertyChanged { private ObservableCollection<TestData> _testDataList = new ObservableCollection<TestData>(); public ObservableCollection<TestData> TestDataList { get => _testDataList; set { if (_testDataList != value) { _testDataList = value; NotifyPropertyChanged(nameof(TestDataList)); } } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } // 其他构造方法、API调用代码... }
内容的提问来源于stack exchange,提问作者C. Cannon
相关产品推荐
相关产品推荐

