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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:05:20