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
相关产品推荐
相关产品推荐

