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 :

Ouvrir une fenêtre avec MVVM


Sujet :

Windows Presentation Foundation

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 41
    Points : 31
    Points
    31
    Par défaut Ouvrir une fenêtre avec MVVM
    Bonjour,

    Question toute simple : où mettre le code pour ouvrir une fenêtre dans le pattern MVVM ?

    Ma MainWindow, facile, dans app.xaml : OnStartup

    Mais après ?

    Si je fais une commande "OuvrirDossier" dans mon VM de MainWindow.
    Je vais avoir du code style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    XyzViewModel vm = new XyzViewModel();
    Window vue = new Window();
    vue.DataContext = vm;
    vue.Open();
    Mais alors, je casse l'indépendance de mon VM vu que je référence explicitement une window.

    Merci de vos réponses,
    Hasan

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    C'est un faux problème car le but principal du MVVM est d'éviter le code-behind. Dans ton cas, tu exécutes du code dans un ViewModel (ce qui est "autorisé") et le couplage entre tes ViewModels reste faible si tu ne fais qu'ouvrir une fenêtre.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Pour faire cela, j'utiliserais plutot un ServiceProvider et un service "d'instanciation" des Windows.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    C'est vrai que j'avais jamais penser à faire comme ça. Je vais l'implémenter de suite dans mes projets

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2007
    Messages : 120
    Points : 109
    Points
    109
    Par défaut
    Dans un post précédent je proposais d'utiliser le pattern mediator et de faire l'opération de création et d'ouverture de mes fenêtre dans le code-behind de ma vue.

    C'est à priori simple à mettre en place et je ne crois pas casser la méthodologie MVVM.

    http://www.developpez.net/forums/d83...-pattern-mvvm/

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Pour faire cela, j'utiliserais plutot un ServiceProvider et un service "d'instanciation" des Windows.
    Je m'interroge quand même sur l'utilité d'une telle mise en place... A la fin, on fait toujours appel à une méthode de type "Show" dans notre viewmodel...

    Si j'ai bien compris, le pattern MVVM permet de faciliter (entre autres) les tests grâce à une abstraction totale des Views. Or là, on appelle une méthode "ShowError" ou "ShowInformation" qui revient à afficher une fenêtre...

  7. #7
    Rédacteur
    Avatar de The_badger_man
    Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2005
    Messages
    2 745
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    Points : 8 538
    Points
    8 538
    Par défaut
    Citation Envoyé par MiniCesc Voir le message
    Je m'interroge quand même sur l'utilité d'une telle mise en place... A la fin, on fait toujours appel à une méthode de type "Show" dans notre viewmodel...

    Si j'ai bien compris, le pattern MVVM permet de faciliter (entre autres) les tests grâce à une abstraction totale des Views. Or là, on appelle une méthode "ShowError" ou "ShowInformation" qui revient à afficher une fenêtre...
    Non car le viewModel utilise l'interface IMessageBoxService. En test tu remplaces l'implémentation par un truc bidon qui n'affiche rien.

    Et ShowError ne veut pas forcément dire afficher une fenetre. Cela peut etre n'importe quoi d'autre. Le ViewModel veut afficher un message mais il n'a aucune idée de comment ça va vraiment se faire niveau UI.
    Les règles du forum
    Le trio magique : FAQ + Cours + fonction rechercher
    Mes articles
    Pas de questions par messages privés svp

    Software is never finished, only abandoned.

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Août 2010
    Messages : 188
    Points : 129
    Points
    129
    Par défaut
    Bonjour,

    Je débute en MVVM je ne sais pas si c'est une bonne solution mais déjà actuellement mon code est entièrement passer dans mes ViewModel et pour ouvrir une fenêtre j'exécute donc le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Window myWindow = new MyWindow();
    ViewModelBase viewModelMyWindow = new ViewModelMyWindow();
    viewModelMyWindow.RequestClose += myWindow.Close;
    myWindow.DataContext = viewModelMyWindow;
     
    videoCapture.Show();
    Cette ligne viewModelMyWindow.RequestClose += myWindow.Close; est normal car j'ai modifier mon ViewModelBase pour une méthode commune, celle de Close(): pour fermer une fenêtre.

    Sinon je pensait modifier plus tard mon code de la façon suivante
    [mon ViewModel]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Window myWindow = new MyWindow ();
    videoCapture.Show();
    [C# de myWindow.xaml]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ViewModelBase viewModelMyWindow = new ViewModelMyWindow();
    viewModelMyWindow.RequestClose += this.Close;
    this.DataContext = viewModelMyWindow;
    Je n'ai pas encore tester cette solution et je devrai d'ailleur pour voir si derrière Blend voit mieux certain élément car actuellement il ne voit rien chez moi.

    Et pour les curieux mes lignes que j'ai ajouter dans le ViewModelBase:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
            #region Member Fields
     
            /// <summary>
            /// The variable that is use to store the Command.
            /// </summary>
            private RelayCommand m_CommandClose;
     
            /// <summary>
            /// The variable for Action close request.
            /// </summary>
            public event Action RequestClose;
     
            #endregion
     
            #region Properties
     
            /// <summary>
            /// Gets the close command.
            /// </summary>
            /// <value>The close command.</value>
            public ICommand CommandCloseWindow
            {
                get
                {
                    if (m_CommandClose == null)
                    {
                        m_CommandClose = new RelayCommand(param => CanClose(), param => Close());
                    }
     
                    return m_CommandClose;
                }
            }
     
            #endregion
     
            #region Event Handlers
     
            /// <summary>
            /// Determines whether window can be close.
            /// </summary>
            /// <returns>
            ///     <c>true</c> if window can be close; otherwise, <c>false</c>.
            /// </returns>
            public virtual bool CanClose()
            {
                return true;
            }
     
            /// <summary>
            /// Close the window.
            /// </summary>
            public virtual void Close()
            {
                if (RequestClose != null)
                {
                    RequestClose();
                }
            }
     
            #endregion
    comme cela dans mes xaml j'ai un bouton écrit comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button Command="{Binding CommandCloseWindow}" Content="Close" />

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    en fait on peut facilement faire un show dans un view model sans que cela ne pose aucun probleme
    (si j'ai tout bien compris)
    ce qui pose probleme en regle general c'est de faire un showdialog
    car a priori dans le VM on ne connait pas la fenetre parente
    or dans ce cas la
    si on ne place pas le owner de la fenetre avec le show dialog
    sur la premiere fenetre
    une fois la premiere fenetre passé au dessus ....

    plus moyen de fermer l'autre fenetre
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par The_badger_man Voir le message
    Non car le viewModel utilise l'interface IMessageBoxService. En test tu remplaces l'implémentation par un truc bidon qui n'affiche rien.

    Et ShowError ne veut pas forcément dire afficher une fenetre. Cela peut etre n'importe quoi d'autre. Le ViewModel veut afficher un message mais il n'a aucune idée de comment ça va vraiment se faire niveau UI.
    D'accord, donc je fais une classe qui va implémenter IMessageBoxService mais qui ne fera rien. Seulement, si j'affiche une boîte de dialogue, c'est pour faire quelque chose (dans mon cas je voudrais que l'utilisateur puisse modifier les propriétés d'un objet). Donc je ne vois pas bien comment on peut simuler ça en test. Mais bon, il faudrait que je me penche sur l'exécution de tests...

    Merci de ta réponse

Discussions similaires

  1. ouvrir une fenètre avec un pixel .
    Par ryry1 dans le forum Téléchargez
    Réponses: 9
    Dernier message: 10/08/2014, 23h02
  2. Ouvrir une fenêtre avec un Thread
    Par darkman13130 dans le forum C#
    Réponses: 1
    Dernier message: 12/04/2011, 12h26
  3. [Batch] Ouvrir une fenêtre DOS avec taille perso ET petit ascenseur
    Par Azerty32 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 17/08/2010, 14h51
  4. Comment ouvrir une fentre avec une taille fixe en javascript
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/07/2007, 16h54
  5. [VB.NET] Comment ouvrir une fenêtre modale avec Thread ?
    Par Damien10 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 19/11/2006, 11h28

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