我正在Controller.ViewDidLoad中创建UIActivityIndicatorView
UIActivityIndicatorView spinner = new UIActivityIndicatorView();
spinner.StartAnimating();
spinner.Hidden = true;
this.Add(spinner);
然后我将其与MVVMCross绑定
var set = this.CreateBindingSet<TipView, TipViewModel>();
set.Bind(spinner).For(v => v.Hidden).To(vm => vm.IsBusy).WithConversion("Inverse");
当View最初加载时,UIActivityIndicatorView旋转并且可见。这是不正确的,因为在ViewModel的Init()中将IsBusy属性显式设置为False。我可以看到这种情况,并且可以看到Converter将值取反。
我知道绑定已正确连接,因为如果我触发更新IsBusy属性的命令,则指示器将按我期望的方式显示和隐藏。只是初始状态不正确。
StartAnimating方法似乎导致Hidden标志被覆盖。如果我不打电话给StartAnimating,指示符会隐藏并按预期显示。当然,这意味着我没有动画
指示符。
我可以得到对VM的WeakReference,听PropertyChanged并调用StartAnimating,但这似乎有点垃圾。
有谁有更好的主意吗?
最佳答案
您可以执行以下操作:
订阅PropertyChanged更改并在事件处理程序中编写自定义代码(如您在问题中所建议的)
从UIActivityIndicatorView
继承并编写一个公共get;set;
属性,该属性在Start
处理程序中提供复合功能(调用Hidden
和set
)
public class MyIndicatorView : UIActivityIndicatorView {
// ctors
private bool _superHidden;
public bool SuperHidden {
get { return _supperHidden; }
set { _superHidden = value; if (!value) StartAnimating() else StopAnimating(); Hidden = value; }
}
}
提供
View
公共get;set;
属性,然后在其中添加复合功能(例如set.Bind(this).For(v => v.MyAdvanced)...
private bool _myAdvanced;
public bool MyAdvanced {
get { return myAdvanced; }
set { myAdvanced = value; if (!value) _spinner.StartAnimating() else _spinner.StopAnimating(); _spinner.Hidden = value; }
}
为Hidden编写一个自定义绑定,以替换默认功能并包含组合的
Start
和Hidden
调用(有关自定义绑定的更多信息,请参见N + 1教程)关于xamarin.ios - UIActivityIndicatorView.StartAnimating重写UIActivityIndicatorView.Hidden绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27906367/