Xamarin.ios 装订';GO';按软件键盘上的键

Xamarin.ios 装订';GO';按软件键盘上的键,xamarin.ios,xamarin,mvvmcross,Xamarin.ios,Xamarin,Mvvmcross,我有一个登录按钮绑定到我的ViewModel中的命令,如下所示: this.AddBindings(new Dictionary<object, string>{{btnLogin,"TouchUpInside LoginCommand"}}); this.AddBindings(新字典{{btnLogin,“TouchUpInside LoginCommand”}); 如果在键盘或UITextField之外的某处进行触摸,则软件键盘将被抑制。 为了避免用户必须单击屏幕上的某个位

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

this.AddBindings(new Dictionary<object, string>{{btnLogin,"TouchUpInside LoginCommand"}});
this.AddBindings(新字典{{btnLogin,“TouchUpInside LoginCommand”});
如果在键盘或
UITextField
之外的某处进行触摸,则软件键盘将被抑制。
为了避免用户必须单击屏幕上的某个位置使键盘消失,然后按下登录按钮,我想将
ViewModel
中定义的登录命令与键盘中的“GO”键相关联。这可能吗

按钮本身无法绑定。这取决于聚焦的
ui视图
,该视图触发键盘上的
GO
按钮。也就是说,如果它是
UITextField
,您可以将函数或委托分配给
ShouldReturn
属性,然后该属性将触发您的
LoginCommand
。比如:

myUiTextField.ShouldReturn += delegate
    {
        ViewModel.LoginCommand.Execute(null);
        return true;
    };
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;
            }
        }
    }
}

阅读有关属性的更多信息。

简单的解决方案就是前面答案中给出的解决方案

但是,如果您想更进一步,则可以添加自定义绑定,实现如下内容:

myUiTextField.ShouldReturn += delegate
    {
        ViewModel.LoginCommand.Execute(null);
        return true;
    };
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));
registry.RegisterCustomBindingFactory(“ShouldReturn”,
textField=>newmvxuitextfieldShouldReturnTargetBinding(textField));
我认为这会起作用-它应该允许您绑定
MvxCommand
MvxCommand


有关自定义绑定的更多信息,请参见小说明中的N=28,需要返回布尔值:myUiTextField.ShouldReturn+=(textField)=>{CurrentViewModel.LoginCommand.Execute(null);return true;};在这种情况下,使用自定义绑定而不是委托有什么好处?