3

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

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

如果在键盘外的某处或UITextField. 为了防止用户不得不在屏幕上的某个地方单击一次以使键盘消失然后按下登录按钮,我想将定义的登录命令ViewModel与键盘中的“GO”键相关联。这可能吗?

4

2 回答 2

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));

我认为这会起作用-它应该允许您绑定 aMvxCommand或 anMvxCommand<string>

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

于 2013-10-18T17:45:24.083 回答
5

您不能绑定按钮本身。这取决于UIView触发键盘具有GO按钮的焦点。即,如果它是一个UITextField,您可以分配一个函数或委托给该ShouldReturn属性,然后触发您的LoginCommand. 就像是:

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

在Xamarin.iOS API 文档中阅读有关该属性的更多信息。

于 2013-10-18T16:51:21.770 回答