2013-05-23 9 views
8

Chcę użyć MVVMCross, jednak dla mojej aplikacji na Androida chcę również korzystać z innych bibliotek (przesuwanego menu i paska akcji), które wymagają dziedziczenia moich klas aktywności z ich niestandardowej klasy. To pozwala mi dziedziczenie MvxActivity, ale zauważyłem, że w MVVMCross dla iOS, można zrobić wszystkie swoje powiązania w kodzie (patrz https://github.com/slodge/NPlus1DaysOfMvvmCross/blob/master/N-00-FirstDemo/FirstDemo.Touch/Views/FirstView.cs)MVVMCross dla Androida - jak wykonać powiązanie w kodzie?

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(); 

Czy jest jakiś sposób, aby to zrobić w Android?

Odpowiedz

11

Tak - możesz używać płynnych wiązań w systemie Android, jeśli chcesz.

Dokładnie ten sam kod powinien działać.

Będziesz musiał uzyskać referencje do kontrolek interfejsu użytkownika za pomocą FindViewById<Type>(), a następnie możesz je powiązać.

Na przykład w TipCalc można dodać zidentyfikowanych elementów sterujących, takich jak:

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

a następnie wdrożyć wiązania przy użyciu:

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() 
    } 

Dodatkowo można przekonwertować dowolny FooActivity do wiązania danych MvxFooActivity przez :

  • dziedziczenie z FooActivity w celu udostępniania zdarzeń z wydarzeń w cyklu Lifetime urceFooActivity
  • dziedziczenie z EventSourceFooActivity dostarczenie datacontext w MvxFooActivity
  • można następnie napisać kod wewnątrz działalności dziedziczenie z MvxFooActivity

Aby zobaczyć kod wymagany, patrz:

Ten sam kod będzie widoczny we wszystkich działaniach dostosowanych do formatu mvx - MvxActivity, MvxTabActivity, ... Tutaj jest mało miejsca na wklejenie, ale jak najwięcej kodu znajduje się we wspólnych metodach rozszerzania.

W poprzednich wersjach, ludzie wykorzystali tę technikę do związania monogame i google działalność Ads - patrz np Insert a Monogame view inside MvvmCross monodroid Activity

+1

Hi Stuart, staram 1st metody, ale to daje wyjątku null ref na Bind() połączenia . Dziedziczę moją aktywność z działania, IMvxBindingContextOwner, IMvxLayoutInflater, IMvxView i samodzielnie utworzę kontekst bindowania i viewmodel. Zauważ, że skoro nie mogę dziedziczyć po MvxActivity, nie mogę tego nazwać. CreateBindingSet, sam też muszę utworzyć MvxAndroidBindingContext. Masz pojęcie, co jest nie tak? Moja próba sprawdzenia, co się dzieje przez skompilowanie kodu źródłowego MVVMCross, również nie powiodła się, VS twierdzi, że nie mógł załadować zestawu system.windows.dll, chociaż usunąłem ref w Cirrious.CrossCore –

+0

Zbyt wiele pytań/komentarzy w tym ostatnim komentarzu. Będę zmieniać "alternatywnie" w mojej odpowiedzi na dodatkowo. Dla wszystkich pozostałych w tym komentarzu nie jestem w trakcie rozmowy z komentarzem - stackoverflow marszczy brwi na te. – Stuart

Powiązane problemy