2013-05-23 11 views
5

Ogni volta che chiamo ShowViewModel, in qualche modo un ViewModel e una Vista dei tipi richiesti vengono recuperati e collegati insieme per la visualizzazione sullo schermo. Quando vengono create nuove istanze di ViewModel e View rispetto a quelle recuperate da una cache? Se vengono create sempre nuove istanze e scelgo di creare la mia cache per prevenire più istanze, come faccio a mostrare la mia istanza di ViewModel memorizzata nella cache?MvvmCross: ShowViewModel crea sempre nuove istanze?

risposta

6

Quando vengono create nuove istanze di ViewModel e View rispetto a quelle recuperate da una cache?

Mai - per le nuove navigazioni il comportamento predefinito è sempre quello di creare nuove istanze.

se ... come si visualizza l'istanza di ViewModel memorizzata nella cache?

Se per qualsiasi motivo si desidera ignorare il ViewModel posizione/creazione, poi ci sono informazioni disponibili circa l'override del DefaultViewModelLocator nel vostro App.cs in:

In parole povere, implementa il tuo codice:

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

poi tornare in App.cs:

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

Si noti che i messaggi più vecchi come How to replace MvxDefaultViewModelLocator in MVVMCross application sono ancora concettualmente compatibili - ma i dettagli in questi post più vecchi sono ormai fuori moda.

+0

Solo per notare che nella mia esperienza con il mio dispositivo WP8 e 'MvvmCross v3', ogni navigazione (nuova o non nuova) è risultata con il nuovo' ctor' per ViewModel. Ho confermato lo stesso comportamento con il codice tutorial 'N-05-MultiPage'. fai riferimento a [questo] (http://stackoverflow.com/questions/16873710/viewmodels-constructor-is-being-called-again-on-navigation-and-so-messenger-su) QUINDI domanda per ulteriori informazioni. – Liel

3

In MvvmCross v3.5 è possibile utilizzare questa classe:

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

nel codice dell'app ignorare questo metodo:

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

Creare un'interfaccia "ICacheableViewModel" e implementare sul vostro ViewModel.

Ora è possibile condividere la stessa istanza di ViewModel con più viste.