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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2003
    Messages : 41
    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 expérimenté
    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
    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 : 43
    Localisation : France

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

  4. #4
    Membre expérimenté
    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
    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 actif
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    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...

  6. #6
    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 : 41
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 745
    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.

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

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

    Informations forums :
    Inscription : Août 2010
    Messages : 188
    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" />

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    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

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    120
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2007
    Messages : 120
    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/

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