Пользовательская привязка MvvmCross UITextField
Поэтому я пытаюсь реализовать пользовательское связывание для UITextField в MvvmCross, в значительной степени по аналогии сСвязывание клавиши «GO» на программной клавиатуре - попытка связать текстовое поле для автоматического запуска события, когда на клавиатуре нажимается кнопка «Готово» (поэтому привязка кShouldReturn
). Мне также нужно привязать текстовое полеEditingDidBegin
а такжеEditingDidEnd
События. Поскольку я связываю более одного события, я создалMvxPropertyInfoTargetBinding
следующее:
public class MyTextFieldTargetBinding : MvxPropertyInfoTargetBinding<UITextField>
{
private ICommand _command;
protected UITextField TextField
{
get { return (UITextField)Target; }
}
public MyTextFieldTargetBinding(object target, PropertyInfo targetPropertyInfo) : base(target, targetPropertyInfo)
{
TextField.ShouldReturn += HandleShouldReturn;
TextField.EditingDidBegin += HandleEditingDidBegin;
TextField.EditingDidEnd += HandleEditingDidEnd;
}
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;
}
private void HandleEditingDidBegin (object sender, EventArgs e)
{
// do something
}
private void HandleEditingDidEnd (object sender, EventArgs e)
{
// do something
}
public override MvxBindingMode DefaultMode
{
get { return MvxBindingMode.OneWay; }
}
public override void SetValue(object value)
{
var command = value as ICommand;
_command = command;
}
public override Type TargetType
{
get { return typeof(ICommand); }
}
protected override void Dispose(bool isDisposing)
{
if (isDisposing)
{
if (TextField != null)
{
TextField.ShouldReturn -= HandleShouldReturn;
TextField.EditingDidBegin -= HandleEditingDidBegin;
TextField.EditingDidEnd -= HandleEditingDidEnd;
}
}
base.Dispose(isDisposing);
}
}
Мой первый вопрос: я прав в созданииMvxPropertyInfoTargetBinding
для всех событий? Соответственно, я не понимаю разницу междуMvxPropertyInfoTargetBinding
а такжеMvxTargetBinding
, В соответствии сMVVMCross Привязка десятичной к UITextField удаляет десятичную точку первый используется при замене существующей привязки, второй - для известных свойств и пар событий. Так я использую правильный?
Во-вторых (и суть моей проблемы), мой код работаеткроме SetValue
- уволен, ноvalue
являетсяnull
, Вот что у меня в моемSetup
файл:
protected override void FillTargetFactories (IMvxTargetBindingFactoryRegistry registry)
{
base.FillTargetFactories (registry);
registry.RegisterPropertyInfoBindingFactory(typeof(MyTextFieldTargetBinding), typeof(UITextField), "Text");
}
Я ничего не делаю в моемView
- возможно, в этом и заключается проблема?
РЕДАКТИРОВАТЬ:
мойViewModel
:
public class LoginViewModel : MvxViewModel
{
private string _username;
public string Username
{
get { return _username; }
set { _username = value; RaisePropertyChanged(() => Username); }
}
private string _password;
public string Password
{
get { return _password; }
set { _password = value; RaisePropertyChanged(() => Password); }
}
private MvxCommand _login;
public ICommand Login
{
get {
_login = _login ?? new MvxCommand(DoLogin);
return _login;
}
}
public LoginViewModel(ILoginManager loginManager)
{
_loginManager = loginManager;
}
private void DoLogin()
{
// call the login web service
}
}
В моем `View 'я ничего необычного не делаю (я создаю элементы View в XIB):
public override void ViewDidLoad()
{
base.ViewDidLoad ();
this.NavigationController.SetNavigationBarHidden(true, false);
var set = this.CreateBindingSet<LoginView, Core.ViewModels.LoginViewModel>();
set.Bind(usernameTextField).To(vm => vm.Username);
set.Bind(passwordTextField).To(vm => vm.Password);
set.Bind (loginButton).To (vm => vm.Login);
set.Apply();
}
Нет интересных сообщений трассировки.