MvvmCross: как привязать к видимости UIBarButtonItem?

У меня есть представление в iOS, которое должно отображаться в двух режимах: один с кнопкой закрытия в заголовке навигации и один без кнопки закрытия. Я добавил логическое значение в свою модель представления, чтобы справиться с этим. Однако у UIBarButtonItem нет свойства Hidden для привязки к этому логическому значению в моей модели представления. Любые предложения о том, как решить эту проблему? ПРИМЕЧАНИЕ. Мне НЕ нужно изменять видимость этой кнопки закрытия во время выполнения. Это всего лишь начальная настройка только для чтения, которая мне нужна перед отображением представления.


person user2395286    schedule 24.05.2013    source источник


Ответы (2)


Для статической настройки вы можете просто попробовать проверить свойство модели представления в коде ViewDidLoad.

Для создания пользовательских привязок см. https://speakerdeck.com/cirrious/custom-bindings-in-mvvmcross

person Stuart    schedule 24.05.2013

У меня была та же проблема, но видимость должна была меняться динамически. Я смог имитировать видимость, отключив кнопку и установив цвет оттенка на прозрачный.

Создайте пользовательскую привязку TargetBinding:

/// <summary>
/// Hides a UIBarButtonItem by disabling and setting the TintColor to Clear
/// </summary>
public class UIBarButtonItemVisibilityTargetBinding : MvxConvertingTargetBinding
{
    protected UIBarButtonItem Button => base.Target as UIBarButtonItem;

    private readonly UIColor _tintColor;

    public UIBarButtonItemVisibilityTargetBinding(UIBarButtonItem button) : base(button)
    {
        this._tintColor = button.TintColor;

        if (button == null) {
            MvxBindingTrace.Trace(MvxTraceLevel.Error, "Error - UIBarButtonItem is null in UIBarButtonItemVisibilityTargetBinding");
        }
    }

    public override MvxBindingMode DefaultMode => MvxBindingMode.OneWay;

    public override System.Type TargetType => typeof(bool);

    protected override void SetValueImpl(object target, object value)
    {
        var button = (UIBarButtonItem) target;
        var enabled = (bool) value;

        button.Enabled = enabled;
        button.TintColor = enabled ? _tintColor : UIColor.Clear;
    }
}

Зарегистрируйте привязку TargetBinding в установочном файле:

    protected override void FillTargetFactories (MvvmCross.Binding.Bindings.Target.Construction.IMvxTargetBindingFactoryRegistry registry)
    {
        base.FillTargetFactories (registry);

        registry.RegisterCustomBindingFactory<UIBarButtonItem> ("Visibility", button => new UIBarButtonItemVisibilityTargetBinding (button));

    }

Привязать к кнопке в контроллере представления с помощью пользовательской привязки:

set.Bind (btnBarItem).For("Visibility").To (vm => vm.ShowButton);
person Oren    schedule 30.03.2016