在软件键盘上绑定“GO”键

时间:2013-10-18 14:27:24

标签: xamarin.ios xamarin mvvmcross

我有一个登录按钮绑定到我ViewModel内的命令,如下所示:

this.AddBindings(new Dictionary<object, string>{{btnLogin,"TouchUpInside LoginCommand"}});

如果在键盘外部某处或UITextField进行了触摸,则会禁止软键盘。 为了防止用户必须在屏幕上的某个位置点击一次以使键盘消失然后按下登录按钮,我想将ViewModel中定义的登录命令与'GO'相关联键盘上的键。这可能吗?

2 个答案:

答案 0 :(得分:6)

简单的解决方案是上一个答案中给出的解决方案。

但是,如果你想进一步,那么你可以添加一个自定义绑定,实现类似:

public class MvxUITextFieldShouldReturnTargetBinding
    : MvxTargetBinding
{
    private ICommand _command;

    protected UITextField View
    {
        get { return Target as UITextField; }
    }

    public MvxUITextFieldShouldReturnTargetBinding(UITextField target)
        : base(target)
    {
        target.ShouldReturn = HandleShouldReturn;
    }

    private bool HandleShouldReturn(UITextField textField)
    {
        if (_command == null)
            return false;

        var text = textField.Text;
        if (!_command.CanExecute(text))
            return false;

        textField.ResignFirstResponder();
        _command.Execute(text);
        return true;
    }

    public override MvxBindingMode DefaultMode
    {
        get { return MvxBindingMode.OneWay; }
    }

    public override void SetValue(object value)
    {
        var command = value as ICommand;
        _command = command;
    }

    public override System.Type TargetType
    {
        get { return typeof(ICommand); }
    }


    protected override void Dispose(bool isDisposing)
    {
        base.Dispose(isDisposing);
        if (isDisposing)
        {
            var editText = View;
            if (editText != null)
            {
                editText.ShouldReturn = null;
            }
        }
    }
}

您可以在设置期间注册为:

        registry.RegisterCustomBindingFactory<UITextField>("ShouldReturn",
                                                           textField => new MvxUITextFieldShouldReturnTargetBinding(textField));

我认为这样可行 - 它应该允许您绑定MvxCommandMvxCommand<string>

有关自定义绑定的更多信息,请参阅http://mvvmcross.wordpress.com

中的N = 28

答案 1 :(得分:5)

您无法绑定按钮本身。这取决于重点UIView,它触发键盘有GO按钮。即如果是UITextField,您可以将一个函数或委托分配给ShouldReturn属性,然后触发您的LoginCommand。类似的东西:

myUiTextField.ShouldReturn += delegate
    {
        ViewModel.LoginCommand.Execute(null);
        return true;
    };

Xamarin.iOS API documentation了解有关该媒体资源的详情。