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;};在这种情况下,使用自定义绑定而不是委托有什么好处?