MvvmCross:如何绑定到uibarbuttonite的可见性?

MvvmCross:如何绑定到uibarbuttonite的可见性?,mvvm,xamarin.ios,xamarin,mvvmcross,Mvvm,Xamarin.ios,Xamarin,Mvvmcross,我在iOS中有一个视图,需要以两种模式显示,一种是在导航标题中有一个关闭按钮,另一种是没有关闭按钮。我在viewmodel中添加了一个bool来处理这个问题。但是,UIBarButtonItem在我的viewmodel中没有绑定到此布尔的隐藏属性。对如何解决这个问题有什么建议吗?注意:我不需要在运行时更改此关闭按钮的可见性。这只是显示视图之前需要的初始只读设置。对于静态设置,您可以尝试在ViewDidLoad代码中检查viewmodel属性 要创建自定义绑定,请参见我也有同样的问题,但可见性需要

我在iOS中有一个视图,需要以两种模式显示,一种是在导航标题中有一个关闭按钮,另一种是没有关闭按钮。我在viewmodel中添加了一个bool来处理这个问题。但是,UIBarButtonItem在我的viewmodel中没有绑定到此布尔的隐藏属性。对如何解决这个问题有什么建议吗?注意:我不需要在运行时更改此关闭按钮的可见性。这只是显示视图之前需要的初始只读设置。

对于静态设置,您可以尝试在ViewDidLoad代码中检查viewmodel属性


要创建自定义绑定,请参见

我也有同样的问题,但可见性需要动态更改。我可以通过禁用按钮并将色调设置为“清除”来模拟可见性

创建自定义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;
    }
}
    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);