2013-05-23 6 views
5

Immer wenn ich ShowViewModel aufrufen, werden irgendwie ein ViewModel und eine View der angeforderten Typen abgerufen und zur Anzeige auf dem Bildschirm zusammen gebunden. Wann werden neue Instanzen von ViewModel und View erstellt, die von einem Cache irgendwo gesucht und abgerufen wurden? Wenn neue Instanzen immer erstellt werden und ich meinen eigenen Cache erstellen möchte, um mehrere Instanzen zu verhindern, wie zeige ich dann meine zwischengespeicherte ViewModel-Instanz an?MvvmCross: Konstruiert ShowViewModel immer neue Instanzen?

Antwort

6

Wann werden neue Instanzen von ViewModel und View erstellt, die im Vergleich zu einem Cache gesucht und abgerufen wurden?

Nie - für neue Navigationen ist das Standardverhalten immer neue Instanzen zu erstellen.

if ... Wie zeige ich meine im Cache gespeicherte ViewModel-Instanz an?

Wenn Sie aus irgendeinem Grund die Ansichtsmodell Standort/Schöpfung außer Kraft setzen möchten, dann gibt es noch verfügbaren Informationen über die DefaultViewModelLocator zwingende in Ihrem App.cs in:

Einfach ausgedrückt, implementieren Sie Ihren Code:

public class MyViewModelLocator 
    : MvxDefaultViewModelLocator 
{ 
    public override bool TryLoad(Type viewModelType, IDictionary<string, string> parameterValueLookup, 
          out IMvxViewModel model) 
    { 
     // your implementation 
    } 
} 

dann schicken Sie es in App.cs:

protected override IMvxViewModelLocator CreateDefaultViewModelLocator() 
{ 
    return new MyViewModelLocator(); 
} 

Beachten Sie, dass ältere Beiträge wie How to replace MvxDefaultViewModelLocator in MVVMCross application noch konzeptionell kompatibel sind - aber die Details in diesen älteren Beiträge sind jetzt veraltet.

+0

Nur zu beachten, dass nach meiner Erfahrung mit meinem WP8-Gerät und 'MvvmCross v3', jede Navigation (neu oder nicht neu) mit neuen' ctor' für das ViewModel resultierte. Ich habe das gleiche Verhalten mit 'N-05-MultiPage' Tutorial Code bestätigt. Bitte beziehen Sie sich auf [diese] (http://stackoverflow.com/questions/16873710/viewmodel-constructor-is-being-again-on-navigation-and-so-messenger-su) SO Frage für weitere Informationen. – Liel

3

In MvvmCross v3.5 Sie diese Klasse verwenden können:

public class CacheableViewModelLocator : MvxDefaultViewModelLocator{ 
public override IMvxViewModel Load(Type viewModelType, IMvxBundle parameterValues, IMvxBundle savedState) 
{ 
    if (viewModelType.GetInterfaces().Any(x=>x == typeof(ICacheableViewModel))) 
    { 
     var cache = Mvx.Resolve<IMvxMultipleViewModelCache>(); 
     var cachedViewModel = cache.GetAndClear(viewModelType); 

     if (cachedViewModel == null) 
      cachedViewModel = base.Load(viewModelType, parameterValues, savedState); 

     cache.Cache(cachedViewModel); 

     return cachedViewModel; 
    } 

    return base.Load(viewModelType, parameterValues, savedState); 
}} 

in Ihrem App-Code überschreiben diese Methode:

protected override IMvxViewModelLocator CreateDefaultViewModelLocator(){ 
return new CacheableViewModelLocator();} 

Eine Schnittstelle "ICacheableViewModel" und setzen es auf Ihrem Ansichtsmodell.

Jetzt können Sie dieselbe ViewModel-Instanz mit mehreren Ansichten teilen.