J'ai un AddClientViewModel qui est référencé par 2 vues (AddClientView and SuspecreDaddressesView). Le AddClientView est un formulaire qui a un champ pour une adresse. Le formulaire a un bouton de validation qui valide l'adresse entrée à l'aide de géocodage. Si plus d'une adresse est renvoyée, la suggestionAddDressesView s'ouvre.
Voici comment je le fais actuellement: P>
AddClientViewModel: P>
public SuggestedAddressesView(ViewModelBase viewModel) { InitializeComponent(); viewModel.ClosingRequest += (sender, e) => this.Close(); }
3 Réponses :
Vous pouvez utiliser RelayCommand de sorte que vous envoyez le paramètre comme suit: en l'utilisant, vous pouvez fermer les vues individuelles. P> Exemple: P>
Dès que vous vous référez aux éléments d'interface utilisateur (dans ce cas, la vue) de la machine virtuelle, vous allez contre des lignes directrices MVVM suggérées. Avec juste que nous pouvons connaître la création de l'objet code> code> dans la machine virtuelle est incorrect. P>
Alors maintenant, redressez ceci: p>
addClientView code> et suggècesedAddressesView code> avec leur propre vm. Génial! Li>
ul>
Implémentation d'une vue Ouvrir / Fermer du VM: P>
- Étant donné que nous ne pouvons pas accéder directement à la vue de notre VM (pour se conformer aux normes), nous pouvons utiliser des approches telles que l'utilisation d'un
Messenger code> (MVVM Light), Épargregator code> ( Prisme) et ainsi de suite pour envoyer un "message" de la machine virtuelle à la vue lorsque vous devez ouvrir / fermer une vue et faire l'opération réelle dans la vue. li>
- De cette façon, la machine virtuelle initie simplement le message et peut être correctement testée par l'unité pour la même opération et ne fait référence à aucun élément d'interface utilisateur. LI>
ul>
Utilisation d'une approche "Messenger" en vue de la vue ouverte forte>: p>
- selon votre logique, c'est le
addClientViewModel code> qui devrait demander le suggérezAddDressesview code> à ouvrir. li>
- Ainsi, lorsque vous détectez
suggècesedAddresses.count> 0 code>, vous envoyez un message au addClientView CODE> Demander-lui d'ouvrir le suggérezAddDressesView code>. li>
- in
addClientView.xaml.cs code> À la réception de ce message, vous feriez ce que vous faites actuellement dans la machine virtuelle. Créez un objet de suggècesedAddressesView code> et appelez .Show () code> dessus. Li>
- Une étape supplémentaire que vous ajouteriez dans le processus de l'étape ci-dessus consiste à attribuer le
dataContext code> de suggècesedAddressesview code> comme SUGGEREDADDRESSEVIEWMODEL CODE>. LI>.
ul>
C'est ça. Maintenant, ce que vous avez, c'est, quand addClientViewModel code> veut suggècesedAddressesView code> affiché, il envoie un message à sa propre vue et que la vue à l'entrée crée et affiche le suggèreDaddressesView code>. De cette façon, la machine virtuelle ne fait référence à aucune vue et que nous gardons des normes MVVM. P>
Utilisation d'une approche "Messenger" de la vue Vue Fermer Strard>: P>
- La fermeture d'un
Voir code> est assez simple. Encore une fois, lorsque vous devez fermer la vue de la machine virtuelle, vous envoyez un message à sa propre vue, demandant qu'elle soit fermée. Li>
- à la réception de ce message, la vue se ferme plutôt via
.hide () code> / .close () code> ou autre que vous voulez vous en débarrasser. < / li>
ul>
Dans ce type de VM gère la fermeture de la vue et vous n'avez aucune dépendance interconnectée. P>
Vous pouvez utiliser Ceci strong> comme point de départ pour vous guider dans la manipulation des "messages" pour cette approche. Il a un téléchargement ci-joint Vous pouvez obtenir et voir comment le messager code> fonctionne. Ceci est avec la lumière MVVM, si vous ne l'utilisez pas ou utilisez quelque chose d'autre / votre propre implémentation MVVM, utilisez-le comme guide pour vous aider à vous rendre à ce dont vous avez besoin. P>
D'accord, cela a du sens! La question que j'ai eu est que j'aimerais que les informations recueillies de suggècesedAdDressesView B> doivent être transmises à la AddClientViewModel B> (par conséquent, pourquoi j'utilisais 1 VM pour 2 vues). La raison pour laquelle je le fais est parce que l'adresse sélectionnée dans le suggèceseddradsesview b> est attribuée à un client défini dans le AddClientViewModel B>.
@ Francisg3 Regardez l'exemple de lien que j'ai posté. Si vous obtenez l'exemple là-bas, la deuxième fenêtre code> ouverte modal / non modal transmet des informations sur le MainWindow. C'est le processus que vous utiliseriez aussi pour votre besoin. Vous utiliseriez à peu près Messenger pour envoyer un message (ici le message sera les données que vous souhaitez envoyer à partir de SusmorSeDaddressviewModel à AddClientViewModel)
ouvrir la fenêtre de ViewModel:
Créer NavigationVice.cs Classe pour la fenêtre d'ouverture: Laissez Navigationervice.cs p>
Mettre maintenant le code suivant dans ce fichier de classe. P>
Window1ViewModel window1ViewModel = new Vindow1ViewModel(); window1ViewModel.Name = MainWindowTextValue; NavigationService navigationService = new NavigationService(); navigationService.ShowWindow1Screen(window1ViewModel);