2013-05-23 5 views
8

Voglio usare MVVMCross, tuttavia per la mia applicazione Android voglio anche usare altre librerie (menu scorrevole e barra delle azioni) che richiedono di ereditare le mie classi di attività dalla loro classe personalizzata. Questo mi impedisce di ereditare MvxActivity, ma ho notato che in MVVMCross per iOS, è possibile fare tutte le associazioni nel codice (vedi https://github.com/slodge/NPlus1DaysOfMvvmCross/blob/master/N-00-FirstDemo/FirstDemo.Touch/Views/FirstView.cs)MVVMCross per Android - come eseguire il binding nel codice?

var set = this.CreateBindingSet<FirstView, FirstViewModel>(); 
set.Bind(textEditFirst).To(vm => vm.FirstName); 
set.Bind(textEditSecond).To(vm => vm.LastName); 
set.Bind(labelFull).To(vm => vm.FullName); 
set.Apply(); 

Esiste un modo per farlo in Android?

risposta

11

Sì, è possibile utilizzare binding fluidi in Android se si desidera.

Esattamente lo stesso codice dovrebbe funzionare.

È necessario ottenere i riferimenti ai controlli dell'interfaccia utente utilizzando FindViewById<Type>(), quindi è possibile associarli.

Per esempio, in TipCalc è possibile aggiungere controlli identificati come:

<EditText 
     android:id="@+id/FluentEdit" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:inputType="number" 
     android:textSize="24dp" 
     android:gravity="right" 
    /> 

e quindi implementare vincolante utilizzando:

protected override void OnViewModelSet() 
    { 
     SetContentView(Resource.Layout.View_Tip); 

     var edit = this.FindViewById<EditText>(Resource.Id.FluentEdit); 

     var set = this.CreateBindingSet<TipView, TipViewModel>(); 
     set.Bind(edit).To(vm => vm.SubTotal); 
     set.Apply(); 

     // for non-default properties use 'For': 
     // set.Bind(edit).For(ed => ed.Text).To(vm => vm.SubTotal); 

     // you can also use: 
     // .WithConversion("converter", "optional parameter") 
     // .OneTime(), .OneWay() or .TwoWay() 
    } 

Inoltre, è possibile convertire qualsiasi FooActivity in un data-binding MvxFooActivity by :

  • ereditato da FooActivity per fornire eventi da eventi di durata in un eventoSo urceFooActivity
  • eredita da EventSourceFooActivity per fornire un DataContext in un MvxFooActivity
  • si può quindi scrivere il codice all'interno attività eredita da MvxFooActivity

Per vedere, il codice richiesto, vedi:

Vedrai lo stesso codice in tutte le attività adattate mvx - MvxActivity, MvxTabActivity, ... C'è un po 'di taglia-e-incolla qui, ma il maggior numero possibile di codice è posto nei metodi di estensione condivisi.

Nelle versioni precedenti, le persone hanno utilizzato questa tecnica per legare monogame e Google Ads attività - ad esempio, vedere Insert a Monogame view inside MvvmCross monodroid Activity

+1

Hi Stuart, sto cercando il primo metodo, ma si tratta di dare eccezione rif nulla sul Bind() chiamata . Io eredito la mia attività da Activity, IMvxBindingContextOwner, IMvxLayoutInflater, IMvxView e creo il contesto di binding e il viewmodel da solo. Si noti che poiché non posso ereditare da MvxActivity, non posso chiamare questo.CreateBindingSet, anche io devo creare il MvxAndroidBindingContext da solo. Qualche idea di cosa c'è che non va? Il mio tentativo di vedere cosa sta succedendo compilando il codice sorgente MVVMCross è fallito, VS dice che non è stato possibile caricare l'assembly system.windows.dll, anche se ho rimosso il ref in Cirrious.CrossCore –

+0

Troppe domande/commenti in quell'ultimo commento. Cambierò "alternativamente" nella mia risposta a inoltre. Per tutto il resto in quel commento, non sto entrando in una conversazione di commento - StackOverflow si acciglia su questi. – Stuart