IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

MVVM : Fermer une fenêtre enfant sans code-behind !


Sujet :

Windows Presentation Foundation

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut MVVM : Fermer une fenêtre enfant sans code-behind !
    Bonjour à tous, et désolé d'avance si cette question à été maintes fois posée avant, j'ai eu beau chercher, aucune réponse ne m'a satisfait d'un point de vue respect du MVVM...

    Ma question est simple mais tordue...
    J'ai une view parent qui depuis son viewmodel, instancie une view enfant (fenêtre modale).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WinTaskName _winTaskName = new WinTaskName();
                        _winTaskName.tbTaskName.Clear();
                        _winTaskName.ShowDialog();
    J'ai de plus deux boutons sur cette view enfant, dont l'un doit fermer la fenêtre enfant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <Button Content="OK" Height="33" x:Name="bValidate" VerticalAlignment="Top" 
    Grid.Row="1" HorizontalAlignment="Right" Margin="0,10,10,0"
     Width="100" Command="{Binding Path=ValidateTaskName}" />
    <Button Content="Cancel" HorizontalAlignment="Left" x:Name="bAnnuler" Width="100" 
    Grid.Column="1" Grid.Row="1" Height="33" VerticalAlignment="Top" 
    Margin="10,10,0,0" Command="{Binding Path=CancelTaskName}" />
    La question est la suivante : Le view model ne connaissant pas la view (par respect du MVVM), comment lors de l'appel de la command ValidateTaskName, je peux faire mon "this.close();" ?

    Je n'ai jusqu'ici trouvé aucune réponse convenable....et ça m'énerveeeeeeeeeeee :p

    D'avance merci pour votre aide

    PS : Mes view connaissent leur ViewModel par le binding du DataContext avec un Locator.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Juste une idée:
    En passant la fenêtre en argument?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par NejNej Voir le message
    Juste une idée:
    En passant la fenêtre en argument?
    Mmmmmm bonjour à toi et merci pour ta réponse....une question qui me vient....passer la fenêtre en argument à....qui ? le view-model ? Sauf erreur de ma part, le viewmodel ne doit pas connaître la view.... :s et c'est là tout l'arrachage de cheveux :p

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Oui au viewmodel.

    Mais tu n'es pas obligé de le passer avec le type de la classe de la window.
    Tu peux récupérer cela sous la forme d'un objet.

    Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((Window)monObjet).Close();
    Après je ne sais pas si cela suffit à respecter M-V-VM.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par NejNej Voir le message
    Oui au viewmodel.

    Mais tu n'es pas obligé de le passer avec le type de la classe de la window.
    Tu peux récupérer cela sous la forme d'un objet.

    Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((Window)monObjet).Close();
    Après je ne sais pas si cela suffit à respecter M-V-VM.
    Mmmmmmm je ne sais pas si je me trompe ou pas mais....c'est pas super propre ça...limite je prefère le code-behind :p il ne doit y avoir aucune référence en fait à la view que ça soit typée ou non

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Ce que tu peux faire, c'est sur ta commande, tu envoie un message (si tu utilise MVVM Light Toolkit) et dans le code behin de ta vue, dans le Loaded, tu accèdes à ton datacontext, dessus, tu récupères l'instance de ton Messenger et tu "t'abonnes" à la reception de ton message.

    Quand tu le reçois, tu fais juste un this.Close();

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2008
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Ce que tu peux faire, c'est sur ta commande, tu envoie un message (si tu utilise MVVM Light Toolkit) et dans le code behin de ta vue, dans le Loaded, tu accèdes à ton datacontext, dessus, tu récupères l'instance de ton Messenger et tu "t'abonnes" à la reception de ton message.

    Quand tu le reçois, tu fais juste un this.Close();
    ....Désolé mais.....j'avoue ne pas trop comprendre là...
    La commande se trouve dans la vue...donc depuis la vue j'envoi un message...et le datacontext s'abonne a la reception d'un message ?....mais faire le this.close() depuis ou ? :S

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Ce que tu peux faire, c'est sur ta commande, tu envoie un message (si tu utilise MVVM Light Toolkit) et dans le code behin de ta vue, dans le Loaded, tu accèdes à ton datacontext, dessus, tu récupères l'instance de ton Messenger et tu "t'abonnes" à la reception de ton message.

    Quand tu le reçois, tu fais juste un this.Close();
    A la place du message(MVVM Light Toolkit) un event classique peut aussi faire l'affaire non?

  9. #9
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par NejNej Voir le message
    A la place du message(MVVM Light Toolkit) un event classique peut aussi faire l'affaire non?
    Oui oui, un event peut aussi faire l'affaire

  10. #10
    Membre averti

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 214
    Points : 341
    Points
    341
    Par défaut
    Pour compléter la réponse de Thomas, voilà un lien vers un article que j'ai écris il y a quelque temps: http://www.japf.fr/2009/09/how-to-cl...m-a-viewmodel/

  11. #11
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Cela dit, dans le MVVM, le view-model n'est pas censé instancier des composants graphiques (et notamment pas de fenêtres modales). C'est de la responsabilité de la vue.

  12. #12
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par PitMaverick78 Voir le message
    Cela dit, dans le MVVM, le view-model n'est pas censé instancier des composants graphiques (et notamment pas de fenêtres modales). C'est de la responsabilité de la vue.
    Oui et non: si tes composants graphiques sont récupérés au moyen d'un container IoC (type Unity), tu ne casses pas le pattern car, en cas de tests, tu as simplement à mocker le service d'affichage des boites de dialogue

  13. #13
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Oui et non: si tes composants graphiques sont récupérés au moyen d'un container IoC (type Unity), tu ne casses pas le pattern car, en cas de tests, tu as simplement à mocker le service d'affichage des boites de dialogue
    Je suis d'accord avec ca, mais la manifestement y'a un "new Window()" dans le vm qui n'est pas encapsulé dans un service d'affichage de boite de dialogue, lors des TU il va y'avoir la boite de dialogue! D'ou ma remarque

  14. #14
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Oui, c'est pourquoi s'il veut vraiment respecter le pattern, il serait bon qu'il utilise un container IoC pour eviter de faire le new (et faire un Resolve à la place) et ca ira tout seul

Discussions similaires

  1. [MVVM] Fermer une fenêtre (sans code behind)
    Par Monkey56 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 22/06/2011, 19h57
  2. [MVVM] Validation sans code behind
    Par anthyme dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 29/07/2009, 18h38
  3. Fermer une fenêtre sans confirmation
    Par ZACKX dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/04/2007, 09h55
  4. comment fermer une fenêtre modale avec le code
    Par Sheriff dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 16/10/2006, 16h36
  5. Comment fermer une fenêtre enfant MDI ?
    Par DeveloMagaly dans le forum Composants VCL
    Réponses: 2
    Dernier message: 30/09/2005, 13h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo