2013-10-18 84 views
1

鍵我有一個登錄按鈕綁定到在我的ViewModel像這樣存在一個命令:綁定「GO」上的軟件鍵盤

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

如果觸摸被進行的軟件鍵盤被抑制,鍵盤之外的某處或UITextField。 爲了防止用戶在屏幕上某處點擊一下,使鍵盤消失,然後按下登錄按鈕,我想將ViewModel中定義的登錄命令與鍵盤。這可能嗎?

回答

6

簡單的解決方案是在上一個答案中給出的。

但是,如果你想走得更遠,那麼你可以添加自定義綁定,實現這樣的:

 registry.RegisterCustomBindingFactory<UITextField>("ShouldReturn", 
                  textField => new MvxUITextFieldShouldReturnTargetBinding(textField)); 

我認爲:

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

,你可以設置爲在登記會工作 - 它應該允許您綁定一個MvxCommandMvxCommand<string>

有關自定義綁定的更多信息,請參閱中的N =

4

您無法綁定按鈕本身。這取決於專注的UIView,這會觸發鍵盤具有GO按鈕。即如果它是UITextField,則可以將函數或委託分配給ShouldReturn屬性,然後該屬性會觸發LoginCommand。例如:

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

瞭解更多關於該物業的Xamarin.iOS API documentation

+0

小記,一個布爾值的回報預期: myUiTextField.ShouldReturn + =(文本框)=> { CurrentViewModel.LoginCommand.Execute(空); 返回true; }; – lpinho