首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIActivityIndicatorView.StartAnimating覆盖UIActivityIndicatorView.Hidden绑定

UIActivityIndicatorView.StartAnimating覆盖UIActivityIndicatorView.Hidden绑定
EN

Stack Overflow用户
提问于 2015-01-12 16:19:39
回答 2查看 1.1K关注 0票数 2

我正在我的Controller.ViewDidLoad中创建一个Controller.ViewDidLoad

代码语言:javascript
复制
UIActivityIndicatorView spinner = new UIActivityIndicatorView();
spinner.StartAnimating();
spinner.Hidden = true;
this.Add(spinner);

然后我将它与MVVMCross绑定

代码语言:javascript
复制
var set = this.CreateBindingSet<TipView, TipViewModel>();
set.Bind(spinner).For(v => v.Hidden).To(vm => vm.IsBusy).WithConversion("Inverse");

当视图最初加载时,UIActivityIndicatorView正在旋转并可见。这是不正确的,因为在ViewModel的Init()中,IsBusy属性被显式设置为False。我可以看到这种情况发生,我可以看到转换器倒置值。

我知道绑定是正确连接的,因为如果我触发一个更新IsBusy属性的命令,就会如我所期望的那样显示和隐藏指示符。只是初始状态是不正确的。

StartAnimating方法似乎会导致隐藏标志被覆盖。如果我不调用StartAnimating,则该指示符将按预期方式隐藏和显示。当然,这意味着我有一个无生命的指示器。

我可以获得一个WeakReference到VM,听PropertyChanged和调用StartAnimating,但这似乎有点垃圾。

有人有更好的主意吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-29 10:36:14

在阅读了@斯洛奇的回复后,我沿着弱事件侦听器的道路运行了代码,以在视图中隐藏和StartAnimating。复制和粘贴这种方法3次后,我意识到有些东西必须改变,所以我执行了他的第四个建议,并编写了一个自定义绑定。FWIW这里是定制绑定

代码语言:javascript
复制
/// <summary>
/// Custom Binding for UIActivityIndicator Hidden. 
/// This binding will ensure the indicator animates when shown and stops when hidden
/// </summary>
public class ActivityIndicatorViewHiddenTargetBinding : MvxConvertingTargetBinding
{
    /// <summary>
    /// Initializes a new instance of the <see cref="ActivityIndicatorViewHiddenTargetBinding"/> class.
    /// </summary>
    /// <param name="target">The target.</param>
    public ActivityIndicatorViewHiddenTargetBinding(UIActivityIndicatorView target)
        : base(target)
    {
        if (target == null)
        {
            MvxBindingTrace.Trace(
                                MvxTraceLevel.Error,
                                "Error - UIActivityIndicatorView is null in ActivityIndicatorViewHiddenTargetBinding");
        }
    }

    /// <summary>
    /// Gets the default binding mode.
    /// </summary>
    /// <value>
    /// The default mode.
    /// </value>
    public override MvxBindingMode DefaultMode
    {
        get { return MvxBindingMode.OneWay; }
    }

    /// <summary>
    /// Gets the type of the target.
    /// </summary>
    /// <value>
    /// The type of the target.
    /// </value>
    public override System.Type TargetType
    {
        get { return typeof(bool); }
    }

    /// <summary>
    /// Gets the view.
    /// </summary>
    /// <value>
    /// The view.
    /// </value>
    protected UIActivityIndicatorView View
    {
        get { return Target as UIActivityIndicatorView; }
    }

    /// <summary>
    /// Sets the value.
    /// </summary>
    /// <param name="target">The target.</param>
    /// <param name="value">The value.</param>
    protected override void SetValueImpl(object target, object value)
    {
        var view = (UIActivityIndicatorView)target;
        if (view == null)
        {
            return;
        }

        view.Hidden = (bool)value;

        if (view.Hidden)
        {
            view.StopAnimating();
        }
        else
        {
            view.StartAnimating();
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2015-01-13 07:51:29

你可以做一些选择:

  1. 订阅PropertyChanged更改并在事件处理程序中编写自定义代码(正如您在问题中建议的那样)
  2. UIActivityIndicatorView继承并编写一个公共get;set;属性,该属性在set处理程序中提供复合功能(调用StartHidden) 公共类MyIndicatorView : UIActivityIndicatorView { // ctors私有bool _superHidden;public bool SuperHidden { get { set _supperHidden;}set{ _superHidden = value;if (!value) StartAnimating() SuperHidden()SuperHidden;Hidden = value;}}
  3. 提供一个View公共get;set;属性,并将复合功能放在其中(例如,set.Bind(this).For(v => v.MyAdvanced)... ) 私有bool _myAdvanced;公共bool MyAdvanced { get {返回myAdvanced;} set { myAdvanced = value;if (!myAdvanced) _spinner.StartAnimating() myAdvanced() _spinner.StopAnimating();_spinner.Hidden = value;}
  4. 为Hidden编写一个自定义绑定,它将替换默认功能,并包含组合的StartHidden调用(有关自定义绑定的更多信息,有几个N+1教程)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27906367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档