2015-03-27 2 views
3

J'ai créé une liaison personnalisée pour l'événement FocusChange sur un EditText à l'aide de MvvmCross. Je peux obtenir l'événement lié et tirant, mais je ne peux pas comprendre comment passer les arguments d'événement. My Custom La liaison est ceÉvénement de liaison d'événement personnalisé MvvmCross Args

using Android.Views; 
using Android.Widget; 
using Cirrious.MvvmCross.Binding; 
using Cirrious.MvvmCross.Binding.Droid.Target; 
using Cirrious.MvvmCross.Binding.Droid.Views; 
using Cirrious.MvvmCross.ViewModels; 
using System; 

namespace MPS_Mobile_Driver.Droid.Bindings 
{ 
    public class MvxEditTextFocusChangeBinding 
     : MvxAndroidTargetBinding 
    { 
     private readonly EditText _editText; 
     private IMvxCommand _command; 

     public MvxEditTextFocusChangeBinding(EditText editText) : base(editText) 
     { 
      _editText = editText; 
      _editText.FocusChange += editTextOnFocusChange; 
     } 

     private void editTextOnFocusChange(object sender, EditText.FocusChangeEventArgs eventArgs) 
     { 
      if (_command != null) 
      { 
       _command.Execute(eventArgs); 
      } 
     } 

     public override void SetValue(object value) 
     { 
      _command = (IMvxCommand)value; 
     } 

     protected override void Dispose(bool isDisposing) 
     { 
      if (isDisposing) 
      { 
       _editText.FocusChange -= editTextOnFocusChange; 
      } 
      base.Dispose(isDisposing); 
     } 

     public override Type TargetType 
     { 
      get { return typeof(IMvxCommand); } 
     } 

     protected override void SetValueImpl(object target, object value) 
     { 
     } 

     public override MvxBindingMode DefaultMode 
     { 
      get { return MvxBindingMode.OneWay; } 
     } 
    } 
} 

Je câbler dans mon ViewModel comme ceci:

public IMvxCommand FocusChange 
{ 
    get 
    { 
     return new MvxCommand(() => 
      OnFocusChange() 
      ); 
    } 
} 

private void OnFocusChange() 
{ 
    //Do Something 
} 

est-il un moyen de faire quelque chose comme

public IMvxCommand FocusChange 
{ 
    get 
    { 
     return new MvxCommand((e) => 
      OnFocusChange(e) 
      ); 
    } 
} 

private void OnFocusChange(EditText.FocusChangeEventArgs e) 
{ 
    //Do Something 
} 

Ce que j'ai essayé de faire là-bas ne fonctionne pas, mais j'espérais qu'il y avait quelque chose de similaire qui pourrait fonctionner. Je suis en mesure de passer les EventArgs lorsque les feux de commande dans la liaison personnalisée avec cette ligne

  _command.Execute(eventArgs); 

Je ne peux pas trouver un moyen de les attraper dans le ViewModel. Est-ce que quelqu'un peut m'aider avec ça?

Jim

Répondre

3

Après avoir essayé plusieurs arrangements différents, je trouve que la syntaxe correcte pour votre câbler MvxCommand est

public IMvxCommand FocusChange 
{ 
    get 
    { 
     return new MvxCommand<EditText.FocusChangeEventArgs>(e => OnFocusChange(e)); 
    } 
} 

private void OnFocusChange(EditText.FocusChangeEventArgs e) 
{ 
    if (!e.HasFocus) 
    { 
     //Do Something 
    } 
} 

Hope this helps!