6
votes

Ouvrir / Fermer Vue de ViewModel

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();
    }


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser RelayCommand de sorte que vous envoyez le paramètre comme suit: xxx

en l'utilisant, vous pouvez fermer les vues individuelles.

Exemple: xxx


0 commentaires

5
votes

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 dans la machine virtuelle est incorrect.

Alors maintenant, redressez ceci:

  • Tout d'abord, essayez de conserver une vue 1 <-> 1 VM dans votre application. Il est plus propre et vous permet de supprimer les implémentations de la même logique très facilement. Ajout d'une vue multiple à la même machine virtuelle même si elle ne le rend pas maladroit.
  • Alors maintenant, vous avez addClientView et suggècesedAddressesView avec leur propre vm. Génial!

    Implémentation d'une vue Ouvrir / Fermer du VM:

    • É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 (MVVM Light), Épargregator ( 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.
    • 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.

      Utilisation d'une approche "Messenger" en vue de la vue ouverte :

      • selon votre logique, c'est le addClientViewModel qui devrait demander le suggérezAddDressesview à ouvrir.
      • Ainsi, lorsque vous détectez suggècesedAddresses.count> 0 , vous envoyez un message au addClientView Demander-lui d'ouvrir le suggérezAddDressesView .
      • in addClientView.xaml.cs À la réception de ce message, vous feriez ce que vous faites actuellement dans la machine virtuelle. Créez un objet de suggècesedAddressesView et appelez .Show () dessus.
      • Une étape supplémentaire que vous ajouteriez dans le processus de l'étape ci-dessus consiste à attribuer le dataContext de suggècesedAddressesview comme SUGGEREDADDRESSEVIEWMODEL . .

        C'est ça. Maintenant, ce que vous avez, c'est, quand addClientViewModel veut suggècesedAddressesView affiché, il envoie un message à sa propre vue et que la vue à l'entrée crée et affiche le suggèreDaddressesView . De cette façon, la machine virtuelle ne fait référence à aucune vue et que nous gardons des normes MVVM.

        Utilisation d'une approche "Messenger" de la vue Vue Fermer :

        • La fermeture d'un Voir 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.
        • à la réception de ce message, la vue se ferme plutôt via .hide () / .close () ou autre que vous voulez vous en débarrasser. < / li>

          Dans ce type de VM gère la fermeture de la vue et vous n'avez aucune dépendance interconnectée.

          Vous pouvez utiliser Ceci 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 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.


2 commentaires

D'accord, cela a du sens! La question que j'ai eu est que j'aimerais que les informations recueillies de suggècesedAdDressesView doivent être transmises à la AddClientViewModel (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 est attribuée à un client défini dans le AddClientViewModel .


@ Francisg3 Regardez l'exemple de lien que j'ai posté. Si vous obtenez l'exemple là-bas, la deuxième fenêtre 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)



0
votes

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);


0 commentaires