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 :

Question MVVM - Event - Command


Sujet :

Windows Presentation Foundation

  1. #1
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut Question MVVM - Event - Command
    Bonjour,

    Voila, je suis confronté à un petit soucis. Je développe une application en WPF en essayant tant bien que mal à appliquer le pattern MVVM. Cependant je me rends compte qu'il est très difficile de supprimer tout code behind d'une Window (pour un UserControl aucun problème).

    En effet, supposons que dans ma fenetre j'ai un calendrier et que sur le changement de date j'appel une procédure dans le ViewModel qui mettra à jour les données projetées dans un DataGrid (par exemple). Comment faire alors pour ne pas avoir de code behind ? Je ne peux pas binder un event à une command ou autre...

    Je suis tombé sur ce lien : http://blog.functionalfun.net/2008/0...ts-in-wpf.html dans lequelle le rédacteur explique comment appliquer une command lorsqu'un évènement est levé. Avant de partir de suite dans le code à suivre aveuglement ce qu'il propose, es-ce une bonne solution ? Y en a t-il d'autres ?

    Un autre exemple tout bête dans un MainWindow (il existe d'autres Window dans le projet):

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void Window_Closing(object sender, CancelEventArgs e)
    {
        Application.Current.Shutdown();
    }

    Comment faire passer ça via une command lorsque l'utilisateur décide de fermer la fenêtre principale ?

    EDIT : Ha et le pire pour moi :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void mniCollecteur_Click(object sender, RoutedEventArgs e)
    {
        MonitoringCollecteurView mcv = new MonitoringCollecteurView();
        mcv.Show();
    }

    Sachant que les ViewModel ne connaissent absoluement pas les View, comment faire pour créer une instance de cette View ?...

    Merci d'avance pour vos conseils

  2. #2
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Il n'y a aucun mal à placer du code de liaison dans le code-behind, car, contrairement à un dogme répandu, le but du MVVM n'est pas de retirer tout le code du code-behind, mais de découpler ce qui tient de la visualisation de ce qui tient du modèle.

    Donc tu peux faire un event-handler sur le changement de date et forwarder vers une propriété du VM, VM qui en réponse mettra à jour la source de données (une ObservableCollection typiquement) à rendre dans la DataGrid, source qui est bindée à la propriété ItemsSource de la DataGrid.

    Mais, au fait, pourquoi as-tu besoin de passer par un event-handler, ne peux-tu pas utiliser la propriété SelectedDate et la binder sur ton VM ?

  3. #3
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    salut,

    Merci pour les conseils, je vois bien ce que tu veux dire.

    Concernant le calendrier... J'y avais juste pas pensé, je viens de faire le test ca fonctionne effectivement très bien

  4. #4
    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
    Citation Envoyé par obito Voir le message
    Je ne peux pas binder un event à une command ou autre...
    Si !

    regarde dans le MVVM Light Toolkit (http://mvvmlight.codeplex.com) et sa classe EventToCommand

  5. #5
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    Citation Envoyé par seriousme Voir le message
    Il n'y a aucun mal à placer du code de liaison dans le code-behind, car, contrairement à un dogme répandu, le but du MVVM n'est pas de retirer tout le code du code-behind, mais de découpler ce qui tient de la visualisation de ce qui tient du modèle.
    En fait, si tu bosses dans une équipe avec des intégrateurs/designers en complément de tes développeurs, le but est tout de même de supprimer un maximum de code behind, l'idéal étant d'enlever tout le code behind.

    Raison à cela : Blend.

  6. #6
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    En fait concernant mes besoins je pourrais très bien laisser tel quel, je suis stagiaire et la probabilité qu'un designer reprenne le projet est faible. Mais elle n'est pas inexistante... En plus je dois avouer que mon appli n'est pas très "jolie". Donc oui mon but reste quand même de coller au plus près du modèle pour déjà rendre quelque chose de "propre" mais aussi de penser aux futur gars qui reprendra mon code et/ou design. (Sachant que dans la boite où je bosse ils sont plutôt spécialisé .NET mais pas WPF/SL).

    Concernant EventToCommand, je vais voir ca, ca m'a l'air interessant, je ne connaissait pas ce ToolKit.

    Merci.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    même si tu peux laisser la gestion d'event pour fermer l'application, pour tout le reste il est préférable de le zapper.

    tout peut se faire par MVVM-Light ou en développant toi même tes behaviors, comme j'ai fait pour ne plus avoir du tout de code behind dans une appli interne à la société.

  8. #8
    Membre émérite Avatar de obito
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    773
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 773
    Par défaut
    Ok je vois que MVVM Light semble être LA bonne solution. Par contre je n'arrive pas à mettre la main sur un sample. Je n'ai malheureusement pas le temps de tout réimplementer en partant du toolkit j'aurais donc seulement besoin de la classe EventToCommand trouvé ici :

    http://www.java2s.com/Open-Source/CS...andVS10.cs.htm

    Mais surtout d'un exemple d'implémentation, sur le site de GalaSoft je vois qu'ils sont enlevé le sample. J'ai bien ajouté les références qu'il faut, j'ai bien la classe mais j'aimerais vraiment trouver un moyen de l'utiliser (cf : http://www.galasoft.ch/mvvm/sample1/ )

    Je ne cherche pas à utiliser sans comprendre mais il me reste une semaine, et je ne me vois pas tout reprendre .

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    lorsque tu utilise blend, tu peux ajouter des Triggers à des composants quelconque...

    blend pour se faire ajoute une référence vers sa lib d'interactivité, et ajoute les namespace au xaml

    tu peux donc te retrouver avec ce genre de chose :
    Code xaml : 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
     
    <UserControl
    	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    	mc:Ignorable="d"
    	xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
    	xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"
    	d:DesignWidth="640" d:DesignHeight="480">
    ...
    			<Button Margin="0,0,257,8" VerticalAlignment="Bottom" Height="30.5" HorizontalAlignment="Right" Width="209" Content="Ajouter un utilisateur" 
    				IsEnabled="{Binding CanCreateUser}">
    				<i:Interaction.Triggers>
    					<i:EventTrigger EventName="Click">
    						<im:ControlStoryboardAction Storyboard="{StaticResource _showBlurCreate}"/>
    					</i:EventTrigger>
    				</i:Interaction.Triggers>
    			</Button>

    ceci est tiré du code source de mon application, pour te montrer ce que blend fait...
    tu va donc modifier im:ControlStoryboardAction et i:EventTrigger
    as tu intégrer les templates à blend ?

    effectivement s'il te reste une semaine, faire tes propres behaviors c'est exclu

  10. #10
    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
    http://mvvmlight.codeplex.com

    Télécharge la source et regarde dedans, tu as aussi des samples

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. MVVM - Binding Command / Event
    Par Pooch dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 06/01/2011, 17h35
  2. [MVVM] Event en Command
    Par anthyme dans le forum Windows Presentation Foundation
    Réponses: 18
    Dernier message: 02/07/2009, 17h08
  3. Petite question sur la commande system()
    Par johnnydepp dans le forum C
    Réponses: 19
    Dernier message: 06/05/2007, 17h00
  4. question sur la commande df
    Par Melvine dans le forum Linux
    Réponses: 5
    Dernier message: 27/12/2006, 18h06
  5. Questions sur la commande awk
    Par vbcasimir dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 17/01/2006, 10h35

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