【问题标题】:Binding 'GO' key on Software Keyboard在软件键盘上绑定“GO”键
【发布时间】:2013-10-28 20:34:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: xamarin.ios xamarin mvvmcross


    【解决方案1】:

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

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

    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&lt;string&gt;

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

    【讨论】:

    • 在这种情况下使用自定义绑定而不是委托有什么好处?
    【解决方案2】:

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

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

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

    【讨论】:

    • 小记,预期返回一个布尔值:myUiTextField.ShouldReturn += (textField) => { CurrentViewModel.LoginCommand.Execute(null);返回真; };
    猜你喜欢
    • 2017-07-26
    • 2012-09-30
    • 2019-01-05
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 2015-11-16
    相关资源
    最近更新 更多