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

MvvmCross.Forms下拉刷新Spinner无法消失问题求助

解决MvxListView下拉刷新Spinner无法消失的问题

我之前也踩过MvxListView下拉刷新Spinner停转不了的坑,折腾了好几个小时才找到症结,给你几个针对性的建议:

1. 关键:绑定IsRefreshing到ViewModel的状态属性

MvxListView的下拉刷新状态不是自动和RefreshCommand的执行状态关联的,它依赖IsRefreshing属性来控制Spinner的显示/隐藏。你现在只绑定了RefreshCommand,但没告诉控件什么时候刷新完成,所以Spinner会一直转。

修改你的XAML,给MvxListView加上IsRefreshing的绑定:

<views:MvxListView 
    HorizontalOptions="FillAndExpand" 
    VerticalOptions="FillAndExpand" 
    SelectionMode="None" 
    ItemsSource="{mvx:MvxBind BtDevices}" 
    ItemClick="{mvx:MvxBind BtDeviceSelectedCommand}" 
    IsPullToRefreshEnabled="True" 
    RefreshCommand="{mvx:MvxBind RefreshBtDevicesCommand}"
    IsRefreshing="{mvx:MvxBind IsBusy}" <!-- 新增这行 -->
    ItemTemplate="{StaticResource DeviceNameTemplate}" 
    RowHeight="{x:OnPlatform Android=55, iOS=55, UWP=40}" 
    BackgroundColor="LightBlue" 
    SeparatorVisibility="None"> 
</views:MvxListView>

2. 确保IsBusy属性正确触发通知

你的ViewModel里的IsBusy需要是一个实现了INotifyPropertyChanged的属性,这样UI才能感知到它的变化。如果还没定义,补充成这样:

private bool _isBusy;
public bool IsBusy
{
    get => _isBusy;
    set => SetProperty(ref _isBusy, value); // MvxViewModel的SetProperty会自动触发RaisePropertyChanged
}

3. 清理冗余的属性通知

你在RefreshBtDevices方法最后调用的await RaisePropertyChanged(() => RefreshBtDevicesCommand);完全没必要,命令对象本身不需要频繁触发属性变化,反而可能干扰控件的状态判断,建议删掉这行。

4. 验证异步流程是否完整执行

可以在IsBusy = false;这行加个日志或者断点,确认异步方法确实走到了这里,没有因为_btService.LoadDevices卡住或者出现隐性的异步阻塞(虽然你说没抛出异常,但这种情况也可能导致状态没更新)。

按上面的步骤调整后,下拉刷新完成时IsBusy=false会同步到IsRefreshing,Spinner应该就能正常消失了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:28:46