2017-08-31 2 views
0

J'ai du mal à trouver la meilleure implémentation. J'utilise Prism et j'ai une vue (ParentView), qui a une petite région en son sein. En fonction de l'élément dans un ddl, une autre vue plus petite (ChildView) est injectée dans la région de ParentView.Prism - déplacer des données entre viewmodels

Le ChildView aura juste quelques propriétés auxquelles je voudrais accéder de la ParentView.

Donc, je me rends compte que je peux utiliser une méthode Publier/Souscrire pour déplacer des données entre viewmodels, mais le problème est que je n'ai rien pour accrocher la publication. La vue est composée de TextBoxes et aucun déclencheur d'événement. Le ChildView peut être très différent basé sur la sélection du ddl. J'aime la séparation propre de chaque ChildView étant sa propre vue injectée dans le ParentView.

Quelle est la meilleure façon d'y parvenir?

Répondre

0

Une solution peut être d'implémenter l'interface INavigationAware dans vos viewmodels. Après cela, vous pouvez utiliser les méthodes onNavigatedFrom(), onNavigatedTo() et onNavigatingTo() pour enregistrer votre événement.

EDIT:

Si vous voulez lancer l'événement lorsqu'un champ chez l'enfant est changé, vous pouvez faire quelque chose comme ceci:

private string _yourField; 

public string YourField 
     { 
      get { return _yourField; } 
      set { SetProperty(ref _yourField, value); 
        //Here you can launch the event 
       } 
     } 

Dans ce cas, lorsque YourField changer l'événement est lancé .

+0

J'ai réfléchi à ça. Mais les méthodes de navigation sont seulement frappées quand le ChildView est chargé. J'avais besoin d'obtenir les valeurs de propriété de ChildView après qu'elles aient été remplies. – theTechGrandma

+0

J'ai édité ma réponse. Vérifiez si cela peut être une bonne solution pour vous. – TeoVr81

+0

Merci! Tu étais proche. J'ai posté ma solution ci-dessous. – theTechGrandma

0

J'ai essayé quelques implémentations, mais celle qui fonctionnait était la création d'une instance singleton de ChildView (childviewmodel) et ensuite l'accès aux propriétés via l'instance. Ce n'est peut-être pas joli, mais ça marche.

private static ChildViewModel _instance = new ChildViewModel(); 
    public static ChildViewModel Instance { get { return _instance; } } 

    #region Properties 

    private ChildModel _childModel= new ChildModel(); 
    public ChildModel _childModel 
    { 
     get { return _instance._childModel; } 
     set 
     { 
      SetProperty(ref _instance._childModel, value); 
     } 
    } 

    private string _childProperty1; 
    public string ChildProperty1 
    { 
     get { return _childProperty1; } 
     set 
     { 
      SetProperty(ref _childProperty1, value); 
      ChildModel.ChildProperty1= _childProperty1; 
     } 
    } 

En réalité - il y avait beaucoup de fils. Je n'en ai listé qu'un pour la démo. Et puis je l'appelle dans ParentView

var _instance = ChildViewModel.Instance; 
var _cm = _instance.ChildModel; 

_parentModel = new ParentModel 
{ 
    Property1= ParentViewProperty1, 
    Property2= _cm.ChildProperty1, 
    }; 

Hope qui aide quelqu'un d'autre.