2016-03-22 13 views
1

Ich habe vor kurzem eine Klasse namens ViewStub gefunden, die verwendet werden kann, um eine Layout-Ressource "lazy-load". Die Benutzung ist sehr einfach:MvvmCross Android ViewStub

In der Layout-Datei Ich verwende:

<ViewStub 
    android:id="@+id/content_stub" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 

Und in meinem Code:

var stub = this.FindViewById<ViewStub>(Resource.Id.content_stub); 
stub.LayoutResource = Resource.Layout.FirstView; 
stub.Inflate(); 

jedoch, auf diese Weise die Bindungen wird nicht funktionieren! Ich weiß, dass mit mvvmcross ich BindingInflate anrufen muss, aber diese Methode ist nicht für eine ViewStub Ich suchte nach etwas wie MvxViewStub, aber ich konnte nichts finden.

Also, gibt es eine Möglichkeit, irgendwie die verbindliche Arbeit mit dem ViewStub zu bekommen? Danke für Ihre Hilfe.

Antwort

2

Nachdem ich durch verschiedene mvvmcross-Quellen gecrawlt bin, habe ich eine Lösung gefunden, die zu funktionieren scheint. Ich bin mir nicht sicher, ob das so ist, wie es gemacht werden sollte. Wenn also jemand einen besseren Ansatz hat, sag es mir bitte.

So funktioniert es jetzt:

using (new MvxBindingContextStackRegistration<IMvxAndroidBindingContext>((IMvxAndroidBindingContext)this.BindingContext)) 
{ 
    var stub = this.FindViewById<ViewStub>(Resource.Id.content_stub); 
    stub.LayoutInflater = this.LayoutInflater; 
    stub.LayoutResource = Resource.Layout.FirstView; 
    stub.Inflate(); 
} 
+1

Meh. Ich schrieb die Antwort mit fast demselben Code. Ja, es ist der richtige Weg :) Ich würde vorschlagen, eine ordentliche Erweiterungsmethode dafür zu schreiben. –

0

Ich hatte etwas Ähnliches zu tun, aber die Unterschiede sind gerade groß genug, dass ich dachte, dass ich eine separate Antwort im Fall schreiben würde es für jedermann nützlich ist. Ich habe einen Spinner, und basierend auf der Auswahl in diesem Spinner wird ein anderer "Chunk" der Benutzeroberfläche angezeigt. Dies nutzt die Fähigkeit von ViewStub, automatisch aufzublähen, wenn die Sichtbarkeit zum ersten Mal auf Sichtbar gesetzt wird.

Per Vorschlag oben, ich habe es eine Erweiterungsmethode:

public static void SetViewStubVisibilityAndInflate(this View view, MvxFragment fragment, ViewStates visibility) 
{ 
    if (view is ViewStub && visibility == ViewStates.Visible) 
    { 
     var stub = (ViewStub)view; 
     using (new MvxBindingContextStackRegistration<IMvxAndroidBindingContext>((IMvxAndroidBindingContext)fragment.BindingContext)) 
     { 
      stub.LayoutInflater = fragment.Activity.LayoutInflater; 
      stub.Inflate(); 
     } 
    } 

    view.Visibility = visibility; 
} 

Und hier ist der Code in meinem UI (was ... könnte sauberer sein):

private void SetCurveInputsVisibility(View view) 
{ 
    var std = view.FindViewById(Resource.Id.CurveTypeStandard); 
    var stdVis = (ViewModel.Values.CurveType == ServoCurveType.Standard ? ViewStates.Visible : ViewStates.Gone); 
    std.SetViewStubVisibilityAndInflate(this, stdVis); 

    var expo = view.FindViewById(Resource.Id.CurveTypeExpo); 
    var expoVis = (ViewModel.Values.CurveType == ServoCurveType.Exponential ? ViewStates.Visible : ViewStates.Gone); 
    expo.SetViewStubVisibilityAndInflate(this, expoVis); 

    var custom = view.FindViewById(Resource.Id.CurveTypeCustom); 
    var customVis = (ViewModel.Values.CurveType == ServoCurveType.Custom ? ViewStates.Visible : ViewStates.Gone); 
    custom.SetViewStubVisibilityAndInflate(this, customVis); 
}