viewdestroy supported platforms mvvm xamarin.android mvvmcross

supported - mvvmcross touch command binding en android



navigation mvvmcross (1)

Estoy buscando una forma de hacer un enlace de comando "Touch" entre axml y ViewModel, o algún otro como FocusChanged, etc.

Un simple comando "Click" funciona bien así: local: MvxBind = "{''Touch'': {''Path'': ''CameraButtonCommand''}}" />

public IMvxCommand CameraButtonCommand { get { return new MvxRelayCommand( () => { RequestNavigate<AugRealityViewModel>(true); }) ; } }

Sin embargo, probé otros tipos de eventos para el control (en este caso es ImageButton) y no se están procesando. Cuando revisé las listas de eventos en la clase de vista, las veo:

public event EventHandler Click; public event EventHandler<View.CreateContextMenuEventArgs> ContextMenuCreated; public event EventHandler<View.FocusChangeEventArgs> FocusChange; public event EventHandler<View.KeyEventArgs> KeyPress; public event EventHandler<View.LongClickEventArgs> LongClick;

Solo el evento Click tiene asociado el EventHandler general, mientras que otros han generado gestores de eventos, y me pregunto si esa es la razón por la que no funciona.

También intenté adjuntar un método a esos eventos en la clase View obteniendo el control adecuado mediante el método FindViewById y funciona de la manera esperada esta vez. Pero de alguna manera no puedo hacerlo en el axml a través de comandos.

También una cosa más. El evento "Click" envía el objeto "EventArgs" como uno de los parámetros, y también la referencia del objeto. Puedo verlo con facilidad si realizo este comportamiento en View Class, pero cuando lo hago mediante el enlace, no veo esos argumentos cuando estoy procesando el comando en ViewModel.


El marco puede vincular automáticamente cualquier evento que requiera tipos EventHandler. Sin embargo, para cualquier evento que requiera un EventHandler con plantillas (con EventArgs personalizados), entonces tiene razón; deberá incluir un enlace personalizado.

La buena noticia es que los enlaces personalizados son fáciles de escribir e incluir.

Por ejemplo, para enlazar:

public event EventHandler<View.LongClickEventArgs> LongClick;

puedes incluir algo como:

public class LongPressEventBinding : MvxBaseAndroidTargetBinding { private readonly View _view; private IMvxCommand _command; public LongPressEventBinding(View view) { _view = view; _view.LongClick += ViewOnLongClick; } private void ViewOnLongClick(object sender, View.LongClickEventArgs eventArgs) { if (_command != null) { _command.Execute(); } } public override void SetValue(object value) { _command = (IMvxCommand)value; } protected override void Dispose(bool isDisposing) { if (isDisposing) { _view.Click -= ViewOnLongClick; } base.Dispose(isDisposing); } public override Type TargetType { get { return typeof(IMvxCommand); } } public override MvxBindingMode DefaultMode { get { return MvxBindingMode.OneWay; } } }

Que se puede configurar en la configuración usando algo como:

protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry) { base.FillTargetFactories(registry); registry.RegisterFactory(new MvxCustomBindingFactory<View>("LongPress", view => new LongPressEventBinding(view))); }

Tenga en cuenta que no puede escribir una única clase que se una a todos los tipos de eventos diferentes, ya que el compilador requiere que incluya el tipo correcto para EventArgs. Sin embargo, puede cambiar bastante fácilmente public class LongClickEventBinding a algo como public class CustomEventBinding<TViewType, TEventArgsType> si lo desea.

Con respecto a qué argumento debe pasar en el método IMvxCommand Execute, supongo que esto depende un poco del método en cuestión, y también depende de si necesita que ViewModel sea compatible con múltiples plataformas, o si solo es para Android.