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

.NET MAUI页面加载时MVVM绑定计时异常问题求助

.NET MAUI页面MVVM绑定计时问题

我在.NET MAUI开发中遇到了页面打开时的MVVM模型绑定计时问题:页面内的Picker控件绑定有时正常,有时失效。为给Picker的ItemsSource加载数据,我通过OnAppearing事件触发ViewModel中的异步命令,该命令会调用内部服务对象异步请求外部API。

我判断问题时好时坏的原因是:内部服务类会将API返回结果缓存10分钟(数据本身不会频繁变动),首次调用时API请求往往来不及完成,导致绑定异常;后续调用直接读取缓存,就能正常工作。

虽然代码采用了标准的Task异步范式,但看起来await并没有等待服务返回结果,就直接执行了InitializeForm里的后续代码。

ViewModel命令代码

public async Task InitializeForm()
{
    IsBusy = true;
    Title = "Project Information";
    var contractorList = await _contractorService.GetActiveContractors();
    ContractorListDTO notListedContractor = new ContractorListDTO()
    {
        Id = Guid.Empty,
        FirstName = "Not",
        LastName = "Listed"
    }; 
    ContractorListDTO blankContractor = new ContractorListDTO()
    {
        Id = Guid.NewGuid(),
        FirstName = "",
        LastName = ""
    };
    ContractorList = contractorList.Where(e => e.ContractorType != ContractorType.Designer).ToList();
    ContractorList.Add(notListedContractor);
    ContractorList.Insert(0, blankContractor);
    SelectedContractor = blankContractor.Id;
    IsBusy = false;
}

Contractor Service方法代码

public async Task<List<ContractorListDTO>> GetActiveContractors()
{
    if (cachedContractors.Count == 0 || cacheExpiration < DateTime.Now)
    {
        string address = "/api/contractor/getall";
        var returnedItem = await GetDTOAsync<List<ContractorListDTO>>(_httpClient, address);
        cachedContractors = returnedItem;
        cacheExpiration = DateTime.Now.AddMinutes(10);
    }
    return cachedContractors;
}

更新:触发OnAppearing的代码

<ContentPage.Behaviors>
    <toolkit:EventToCommandBehavior Command="{Binding InitializeFormCommand}" EventName="Appearing" />
</ContentPage.Behaviors>

求各位帮忙分析问题出在哪?

内容的提问来源于stack exchange,提问作者Matt S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 16:11:01