2013-09-23 2 views
6

Scrivere la mia pagina di accesso in IOS Droid utilizzando MVVMCross.Come associare la proprietà 'enabled' di un elemento dell'interfaccia utente monotouch a un viewmodel booleano in Mvvmcross

questo è quello che ho finora

var bindingSet = this.CreateBindingSet<LoginPageView, LoginPageViewModel>(); 
bindingSet.Bind(this.UsernameTextField).To(x => x.UserName).TwoWay(); 
bindingSet.Bind(this.UsernameTextField).For(x=>x.Enabled).To(x => !x.LoggingIn); 
bindingSet.Apply(); 

Il legame di 'UserName' si lega con successo al UsernameTextField. Tuttavia, quando viene attivato il LoginCommand (escluso per brevità), non è possibile impostare il controllo dell'interfaccia utente come "Abilitato = falso" mentre la routine di accesso è in corso.

Il codice di cui sopra non riesce a run-time presso il x.Enabled vincolante, con

System.ArgumentException: Property expression must be of the form 'x => x.SomeProperty.SomeOtherProperty' 

devo essere iscritto l'associazione in modo non corretto, come faccio io desidero associare alla proprietà 'Enabled' direttamente, e non un oggetto per bambini - ma non riesco a capire come farlo.

Ho esaminato alcuni esempi su mvvmcross e ho esaminato alcuni video N + 1 ma non riesco a trovare un abbinamento di esempio abilitato o un altro bind di proprietà figlio.

Grazie

risposta

10

Non riuscivo a vedere cosa non andava con il codice - ma ho appena provato https://github.com/slodge/Enabling e che sembrava funzionare ...

così ho preso un altro sguardo ... e il problema ISN 't nel abilitato - invece è in:

 To(x => !x.LoggingIn) 

Questa non è una semplice espressione di proprietà - è ottenuto l'operatore ! lì.

Invece di utilizzare ! è possibile utilizzare un ValueConverter come:

public class InverseValueConverter : MvxValueConverter<bool, bool> 
    { 
     protected override bool Convert(bool value, ...) 
     { 
      return !value; 
     } 
    } 

Poi:

bindingSet.Bind(this.UsernameTextField) 
      .For(x=>x.Enabled) 
      .To(x => x.LoggingIn) 
      .WithConversion(new InverseValueConverter(), null); 
+0

di lavoro ora con la vostra soluzione. Stavo pensando troppo a Linq e non abbastanza vincoli di proprietà! Grazie –