MvvmCross中通过IsLoading属性控制BTProgressHUD显示的绑定问题
解决MvvmCross绑定BTProgressHUD显示隐藏的问题
嘿,我刚好碰到过类似的问题!你没法直接用CreateBindingSet绑定BTProgressHUD.Show()是因为它是个静态方法,不是控件的可绑定属性。不过MvvmCross提供了更灵活的方式来监听ViewModel属性变化,完全可以实现你要的“属性变化时执行View操作”的效果,就像iOS的闭包回调一样。
具体实现步骤
你可以通过WhenAnyValue方法监听ViewModel的IsLoading属性变化,在属性值改变时直接调用BTProgressHUD的显示/隐藏方法。
1. 基础绑定+属性监听代码(以iOS为例)
在你的LoginView中,完成基础控件绑定后,添加属性监听逻辑:
private IDisposable _loadingSubscription; protected override void OnViewModelSet() { base.OnViewModelSet(); // 原有的基础控件绑定 var set = this.CreateBindingSet<LoginView, LoginViewModel>(); set.Bind(txtUser).To(vm => vm.Username); set.Bind(txtPassword).To(vm => vm.Password); set.Bind(btnLogin).To(vm => vm.LoginCommand); set.Apply(); // 监听IsLoading属性变化,控制BTProgressHUD _loadingSubscription = ViewModel.WhenAnyValue(vm => vm.IsLoading) .Subscribe(isLoading => { if (isLoading) { BTProgressHUD.Show("加载中..."); // 可自定义提示文本 } else { BTProgressHUD.Dismiss(); } }); } // 记得在View销毁时取消订阅,避免内存泄漏 protected override void Dispose(bool disposing) { if (disposing) { _loadingSubscription?.Dispose(); } base.Dispose(disposing); }
2. Android项目的适配逻辑
如果是Android项目,监听属性的代码完全一致,只是BTProgressHUD的调用需要传入上下文:
_loadingSubscription = ViewModel.WhenAnyValue(vm => vm.IsLoading) .Subscribe(isLoading => { if (isLoading) { BTProgressHUD.Show(this, "加载中..."); } else { BTProgressHUD.Dismiss(this); } });
原理说明
WhenAnyValue是MvvmCross提供的属性监听工具,它会在IsLoading的属性值发生变化时,自动触发订阅的回调方法。- 这种方式本质上就是把ViewModel属性变化和View层的操作直接关联,和iOS的闭包回调逻辑完全对应,完美解决了你没法直接绑定静态方法的问题。
内容的提问来源于stack exchange,提问作者pankaj
相关产品推荐
相关产品推荐

