2013-06-06 4 views
7

C'è una tale capacità di legarsi azioni pulsanti direttamente in questo modo:MvvmCross: GestureRecognized vincolante per l'azione ViewModel

var set = this.CreateBindingSet<... 
set.Bind(button).To(x => x.Go); 

ma quello che sta UITapGestureRecognizer, per esempio. Come dovrei legarlo (è azione del rubinetto) in modo così elegante?

Grazie!

risposta

15

Si potrebbe aggiungere da soli se si desidera.

ad es. qualcosa come

public class TapBehaviour 
    { 
     public ICommand Command { get;set; } 

     public TapBehaviour(UIView view) 
     { 
      var tap = new UITapGestureRecognizer(() => 
      { 
       var command = Command; 
       if (command != null) 
        command.Execute(null); 
      }); 
      view.AddGestureRecognizer(tap); 
     } 
    } 

    public static class BehaviourExtensions 
    { 
     public static TapBehaviour Tap(this UIView view) 
     { 
      return new TapBehaviour(view); 
     } 
    } 

    // binding 
    set.Bind(label.Tap()).For(tap => tap.Command).To(x => x.Go); 

Penso che funzionerebbe, ma questa è la codifica dal vivo qui!


Avanzate> Se si volesse, si potrebbe anche eliminare la necessità per la parte For(tap => tap.Command) registrando una proprietà vincolante predefinita per TapBehaviour - per fare questo esclusione Setup.FillBindingNames ed impiego:

registry.AddOrOverwrite(typeof (TapBehaviour), "Command"); 

Dopo questo , allora il legame potrebbe essere:

set.Bind(label.Tap()).To(x => x.Go); 

+0

Grazie molto! Nonostante i piccoli errori di digitazione, tutto funziona come un incantesimo! – Agat

+0

Si prega di modificare la risposta per correggere gli errori. Grazie. – Stuart

+0

aggiornato. È stato un trucco cambiare solo 4 caratteri (a causa delle restrizioni di stackoverflow). he lui – Agat

13

Solo per refe Renče. versione più recente di MvvMcross include un'estensione metodo UIView (vedi MvxTapGestureRecognizerBehaviour) fuori dalla scatola che è possibile utilizzare per associare il gesto del rubinetto:

using Cirrious.MvvmCross.Binding.Touch.Views.Gestures; 

// in this case "Photo" is an MvxImageView 
set.Bind(Photo.Tap()).For(tap => tap.Command).To("OpenImage"); 
+1

Grazie per il riferimento. Ho aggiunto un riconoscitore di gesti per lo scorrimento: https://github.com/MvvmCross/MvvmCross/pull/1266 – SimonSimCity

+0

Questo è stupefacente. Non sono sicuro di come non sapessi di queste estensioni. Mi ha salvato così tanto lavoro da legare a un tocco su UIStackview. – NovaJoe