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
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:
- MVVMCross Passing values to ViewModel that has 2 constructors
- http://slodge.blogspot.co.uk/2013/01/navigating-between-viewmodels-by-more.html
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.
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.
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