2015-09-18 1 views
0

Je travaille sur l'application Android Xamarin.J'utilise MvvmCross modèle pour ViewModels.MvvmCross transmettre des données de One viewmodel à un autre viewmodel

Maintenant, je veux passer des données d'un ViewModel à un autre viewmodel mais je ne veux pas naviguer vers ce ViewModel. Au lieu de naviguer vers ce ViewModel Je veux naviguer vers un autre ViewModel. Par exemple: J'ai trois ViewModels V1, V2 et V3.Now je veux passer des données de V1 à V2, mais je veux naviguer vers V3.

Est-ce possible?

Répondre

3

Regardez dans le Messager MvvmCross faire: https://github.com/MvvmCross/MvvmCross-Plugins/tree/master/Messenger

Vous devez vous abonner quelque chose sur votre viewmodel:

public class LocationViewModel 
: MvxViewModel 
{ 
private readonly MvxSubscriptionToken _token; 

public LocationViewModel(IMvxMessenger messenger) 
{ 
    _token = messenger.Subscribe<LocationMessage>(OnLocationMessage); 
} 

private void OnLocationMessage(LocationMessage locationMessage) 
{ 
    Lat = locationMessage.Lat; 
    Lng = locationMessage.Lng; 
} 

// remainder of ViewModel 
} 
0

La meilleure façon de le faire est d'utiliser le Messenger Plugin de MvvmCross.You peut abonnez un certain type de message dans V2 et publiez ce message dans V1, puis naviguez vers V3 dans une étape séparée.

// subscribing to a certain message type 
this.logoutToken = this.messenger.Subscribe<LogoutMessage>(this.HandleLogoutMessage); 

// Creating and sending a message 
var logoutMessage = new LogoutMessage(this, "You have been logged out."); 
this.messenger.Publish(logoutMessage); 

Note: Il est important d'attribuer la MessageToken à une variable membre (comme dans l'autre réponse), parce que sinon il va se nettoyer par le garbage collector.

0

Une alternative au plugin Messenger mentionné, je suggère de sauvegarder les données que vous avez besoin de partager dans un « service », étant le service une classe singleton gérée par MvvmCross:

CreatableTypes() 
    .EndingWith("Service") 
    .AsInterfaces() 
    .RegisterAsLazySingleton(); 

Dans vos modèles de vue vous peut utiliser cette singleton en ajoutant simplement au constructeur:

public WhateverViewModel(IService service) 

le service sera singleton afin que vos données sur l'application persiste le cycle en direct.

Ainsi, dans l'un de vos modèles de vue que vous pourriez faire:

service.SharedData = new SharedData(); 

Dans un autre modèle de vue:

this.data = service.SharedData