2010-11-11 18 views
0

cela pourrait être compliqué à expliquer, mais je donne un essai ...MVVM Light Toolkit Messenger Messages chaînés

Je voudrais utiliser le Messenger pour accéder à une nouvelle page et aussi créer un nouvel objet (ou laissez-passer un). Comment est-ce possible ou suis-je sur le mauvais chemin?

Fondamentalement: Cliquez sur le bouton "Ajouter une nouvelle personne" qui devrait faire apparaître le PersonView et devrait également contenir une nouvelle instance d'un objet personnel.

Cliquez sur le bouton "Ajouter une personne" qui devrait afficher la même page PersonView et devrait recevoir l'objet sélectionné.

Message 1 = ouvert Uri/Message 2 envoie un objet existant ou un nouvel objet.

Jusqu'à présent, j'ai MainPageViewModel qui envoie

Messenger.Default.Send<Uri>(...)... 

Et MainPage.cs qui enregistre Messenger.Default.Register<Uri>(...) et exécute

Frame.Navigate(...targetUri).... 

I tryed pour envoyer un message à l'PersonViewModel juste après Frame.Navigate ... mais il n'y a plus de synchronisation ... donc la page n'a pas été chargée pour recevoir le PersonMessage, ...

Donc, des conseils, des astuces, coups de langue, les approches seraient greate ...

Merci ...

Répondre

1

Hope this helps, basiquement il est une simple classe Singleton qui obtient le cadre de navigation de la page qui contient, après que vous pouvez l'utiliser dans votre viewmodel et naviguer, et être averti lorsque la page change, ainsi vous contrôlez mieux la navigation et envoyez des messages, et soyez informé de l'état de votre page.


public class NavigationFrameController {

private static NavigationFrameController _instance;  
    private MainPage _root; 
    public Frame NavFrame { get; set;} 
    private static object keyLock = new Object(); 

    NavigationFrameController() { 

     _root = (MainPage)Application.Current.RootVisual; 
     NavFrame = _root.ContentFrame; 
     NavFrame.Navigated += new NavigatedEventHandler(ContentFrame_Navigated); 
     NavFrame.NavigationFailed += new NavigationFailedEventHandler(ContentFrame_NavigationFailed); 

    } 

    public static NavigationFrameController Instance { 
     get { 
      if (_instance == null) 
       lock (keyLock) { 
        _instance = new NavigationFrameController(); 
       } 
      return _instance; 
     } 
    } 

    public void NavigateTo(Uri uri) { 

     NavFrame.Source = uri; 

    } 

    private void ContentFrame_Navigated(object sender, NavigationEventArgs e) { 
      //send your message 
      // get attached to this event and get notified 

    } 

     private void ContentFrame_NavigationFailed(object sender, NavigationFailedEventArgs e) { 
    } 
+0

Merci pour le commentaire. Activer l'écran fonctionne déjà ...Le kicker doit passer/ou envoyer un objet juste après le lancement de la vue – silverfighter

+0

Après l'événement contentframe_navigated vous pouvez envoyer un message avec votre objet, au viewmodel qui gère la page dans le cadre, ou vous pouvez encapsuler cet événement en en créant un nouveau pour la classe, être averti et envoyer le message, j'ai fait quelque chose comme ça et cela a fonctionné, mais je ne sais pas si cela correspond à vos besoins. Cordialement. –

0

J'ai eu le même problème - essentiellement lorsque vous recevez le message d'ouvrir une nouvelle fenêtre créer aussi le viewmodel et l'ajouter à la vue comme datacontext. Lorsque vous instanciez votre modèle viewmodel dans l'objet existant ou null etc ... alors dans votre viewmodel vous pouvez gérer s'il s'agit d'un objet nouveau ou existant.

Si vous utilisez l'injection de dépendance alors appeler une résolution du codebehind où vous traitez le messsage « ajouter une personne » etc ..

+0

J'utilise ViewModelLocator centralisé avec Ninject. Donc, lors de la création de Vue, la vue sait automatiquement à quel ViewModel se connecter ... – silverfighter

+0

Correct - J'utilise l'unité avec viewmodel locator sauf si j'ai besoin de passer un paramètre via un constructeur puis j'utilise la méthode que j'ai décrite plus haut. Cela ne viole pas les règles MVVM car la vue n'est pas créée dans viewmodel ou ailleurs que dans la vue. – dnndeveloper

0

Je pense que ce que vous devez faire est de garder le premier message pour la navigation, et ajouter C'est l'information sur l'objet (la personne) que vous voulez envoyer. vous pouvez ajouter un paramètre à la chaîne de requête, dire "add = true" et ensuite vous pouvez créer l'objet normalement dans le modèle de vue, ou l'ID de l'objet à éditer, et dans ce cas, le viewmodel peut récupérer l'objet lui-même et éditez-le. Pour cela, dans le code de PersonView (associé à PersonViewModel), il faut envoyer un message lors de la navigation (OnNavigatedTo) vers son ViewModel contenant les informations reçues de la chaîne de requête.