UIActivityIndicatorView

UIActivityIndicatorView

我正在Controller.ViewDidLoad中创建UIActivityIndi​​catorView

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最初加载时,UIActivityIndi​​catorView旋转并且可见。这是不正确的,因为在ViewModel的Init()中将IsBusy属性显式设置为False。我可以看到这种情况,并且可以看到Converter将值取反。

我知道绑定已正确连接,因为如果我触发更新IsBusy属性的命令,则指示器将按我期望的方式显示和隐藏。只是初始状态不正确。

StartAnimating方法似乎导致Hidden标志被覆盖。如果我不打电话给StartAnimating,指示符会隐藏并按预期显示。当然,这意味着我没有动画
指示符。

我可以得到对VM的WeakReference,听PropertyChanged并调用StartAnimating,但这似乎有点垃圾。

有谁有更好的主意吗?

最佳答案

您可以执行以下操作:


订阅PropertyChanged更改并在事件处理程序中编写自定义代码(如您在问题中所建议的)
UIActivityIndicatorView继承并编写一个公共get;set;属性,该属性在Start处理程序中提供复合功能(调用Hiddenset

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编写一个自定义绑定,以替换默认功能并包含组合的StartHidden调用(有关自定义绑定的更多信息,请参见N + 1教程)

关于xamarin.ios - UIActivityIndi​​catorView.StartAnimating重写UIActivityIndi​​catorView.Hidden绑定(bind),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27906367/

10-11 04:25