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] Event en Command


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut [MVVM] Event en Command
    Bonjour,

    J'aimerai binder un Event de ma View a une Command de mon ViewModel (Loaded pour ce coup ci).

    Est ce qu'il y a des techniques pour ça ?

    Merci

  2. #2
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Mon topic exposait le même problème :
    http://www.developpez.net/forums/d77...mandes-souris/

    Il faut utiliser un genre de pattern décorateur (behavior) pour implémenter les fonctionnalités des Event et donc qu'ils correspondent à des ICommand.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  3. #3
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    ok merci !

    Je commence a me demander si mon approche est bonne par contre ...

    Je veux initialiser ma vue avec un ID (on va dire que c'est une vue d'édition d'objet).
    Donc j'aimerai créer ma vue via un constructeur "public MaVue(Guid id)"
    et remonter cet Id dans le ViewModel.

    Je pensais copier ca vers le viewModel dans le constructeur de la vue (un truc du style (DataContext as MonViewModel).ObjectID = id) et ensuite cet id pourrait être utilisé dans le view model une fois l evenement Loaded levé ...

    Mais finalement, ca me parait super crade

    Des avis ?

  4. #4
    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
    Pourquoi est-ce la vue qui reçoit l'id et non pas le ViewModel ?
    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.

  5. #5
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Euhhhh je ne comprend pas ?

    Passer des ViewModel en argument de la construction d'une vue ? ca se fait ça ?

    Pour le moment j'ai toujours instancié un viewmodel de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        <UserControl.Resources>
            <viewmodels:GraphMarkPartViewModel x:Key="ViewModel" />
            <views:GraphMarkLinesConverter x:Key="GraphMarkLinesConverter" />
        </UserControl.Resources>
        <UserControl.DataContext>
            <Binding Source="{StaticResource ViewModel}"/>
        </UserControl.DataContext>
    Comment je vais pouvoir remplacer ce code si je passe mon ViewModel en argument de mon constructeur ?

  6. #6
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par anthyme Voir le message
    Euhhhh je ne comprend pas ?

    Passer des ViewModel en argument de la construction d'une vue ? ca se fait ça ?

    Pour le moment j'ai toujours instancié un viewmodel de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        <UserControl.Resources>
            <viewmodels:GraphMarkPartViewModel x:Key="ViewModel" />
            <views:GraphMarkLinesConverter x:Key="GraphMarkLinesConverter" />
        </UserControl.Resources>
        <UserControl.DataContext>
            <Binding Source="{StaticResource ViewModel}"/>
        </UserControl.DataContext>
    Comment je vais pouvoir remplacer ce code si je passe mon ViewModel en argument de mon constructeur ?
    Euh je ne sais pas si ma façon est la bonne mais je n'initialise pas de ViewModel via la Vue.

    Dans mon cas c'est la classe principal qui créée mon ViewModel. La Vue n'a pas à connaître le ViewModel, elle doit juste se binder sur le DataContext courant. Evidement ce DataContext courant est le ViewModel.

    A confirmer tout ce que je viens de dire bien sur
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  7. #7
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    bas si tu le passe en argument du constructeur de ta vue elle a quand même conscience de son existence...

    De plus comment tu instancie des vue en pure XAML de cette façon ?

    Et sinon j'aime bien mettre le modelView en resource ca permet de le retrouver facilement même quand t'es "perdu" au sein d une listview

  8. #8
    Modérateur

    Avatar de Robin56
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Juin 2009
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Juin 2009
    Messages : 5 297
    Par défaut
    Citation Envoyé par anthyme Voir le message
    bas si tu le passe en argument du constructeur de ta vue elle a quand même conscience de son existence...

    De plus comment tu instancie des vue en pure XAML de cette façon ?
    Je ne comprends pas vraiment ta question. La vue a dans le meilleure des cas aucun code behind donc oui elle peut être instanciée en XAML pure (dans le meilleur des cas bien sur).

    Je suppose que tu connais ce lien : http://japf.developpez.com/tutoriels...-et-testables/

    Je me suis directement inspiré de celui-ci. Il répondra peut être mieux que des explications.
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Architecte Solution
    LinkedIn : https://www.linkedin.com/in/nicolascaudard/

  9. #9
    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 anthyme Voir le message
    Passer des ViewModel en argument de la construction d'une vue ? ca se fait ça ?
    Non, mais des fois, je fais l'inverse: je passe la vue en paramètre du constructeur du VM.

  10. #10
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Citation Envoyé par Robin56 Voir le message
    Je ne comprends pas vraiment ta question. La vue a dans le meilleure des cas aucun code behind donc oui elle peut être instanciée en XAML pure (dans le meilleur des cas bien sur).

    Je suppose que tu connais ce lien : http://japf.developpez.com/tutoriels...-et-testables/

    Je me suis directement inspiré de celui-ci. Il répondra peut être mieux que des explications.
    je disais ca en rapport avec ce que The_badger_man disait... si la vue a un constructeur avec un argument ViewModel, je vois pas comment la construire en pure XAML.

    Ensuite l'avantage de le mettre en resource c'est que cela me permet de faire ce genre de manipulation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button Content="Ajouter une ligne" Command="{Binding AddLineCommand, Source={StaticResource ViewModel}}" CommandParameter="{Binding}"/>
    En effet une fois dans un listview on ne peut plus récupérer les command du viewmodel car le datacontext est mappé aux objets de l'itemsource de la listview

    Citation Envoyé par Thomas Lebrun Voir le message
    Non, mais des fois, je fais l'inverse: je passe la vue en paramètre du constructeur du VM.
    Ok donc tu crée ta vue, tu la "pose" dans ton UI et tu créé ton viewmodel en lui passant en argument la vue, le view model se charge ensuite de se mettre dans le datacontext de la vue. J'ai bon ?

    Ca me plait moyennement j'ai l'impression que ca "casse" le MVVM mais d'un autre coté ca me semble aussi le plus efficace ... je vais surement partir dans cette optique

  11. #11
    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 anthyme Voir le message
    Ok donc tu crée ta vue, tu la "pose" dans ton UI et tu créé ton viewmodel en lui passant en argument la vue, le view model se charge ensuite de se mettre dans le datacontext de la vue. J'ai bon ?
    Exact

    Ca me plait moyennement j'ai l'impression que ca "casse" le MVVM mais d'un autre coté ca me semble aussi le plus efficace ... je vais surement partir dans cette optique
    C'est vrai que moi aussi, ca me plait moyennement. De plus, je me dit que les ViewModel doivent-être le plus indépendant possibles (donc ne pas référencer la vue si possible). Donc maintenant, j'essaye si possible d'éviter au maximum (et on peut y arriver la plupart du temps )

  12. #12
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Bon ca fait plaisir de voir qu'on pense pareil

    Par contre vu que je n'ai plus mon ViewModel en resource mais juste dans le datacontext de la vue, est ce que vous pouvez m'aider a corriger mes boutons de ma listview ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button Grid.Column="2" Content="up" Command="{Binding UpCommand, Source={StaticResource ViewModel}}" CommandParameter="{Binding}"/>
    J'ai tenté de mettre mon viewmodel dynamiquement dans les ressources mais bon comme ici le systeme de récupération est "StaticResource" cela ne fonctionnent pas ... et dans la propriété source d'un binding on ne peux pas mettre de DynamicResource ...
    Il y a un moyen de faire pointer la source d'un binding vers le "this.DataContext" ?

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Essaie ça :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button Grid.Column="2" Content="up" Command="{Binding UpCommand}" />

  14. #14
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Euh non ca ne peux pas marcher ... (j'ai quand même testé)

    Je suis dans une listview donc le DataContext n'est plus le ViewModel mais un objet business qui ne contient pas les commandes

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    J'avais raté quelques infos

    Est-ce qu'un Binding de ce type marche :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button Grid.Column="2" Content="up" Command="{Binding ElementName=UC, Path=DataContext}" />
    où UC serait le nom de ta vue où tu as chargé ton DataContext

  16. #16
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Pour le nom, tu veux dire mettre Name="UC" sur la balise usercontrol ?

    Si c'est ça je dirais ... pas mieux

  17. #17
    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 anthyme Voir le message
    Euh non ca ne peux pas marcher ... (j'ai quand même testé)

    Je suis dans une listview donc le DataContext n'est plus le ViewModel mais un objet business qui ne contient pas les commandes
    Au lieu de faire une liste d'objets business que t'utilises comme DataSource de ta listview, tu peux faire une liste de ViewModel. Ces ViewModel auraient alors la commande qui deviendrait accessible depuis ta liste.
    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.

  18. #18
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    C'est ce que je voulais dire. Je ne vois pas trop du coup comment corriger le binding

    Par contre, moi je ferais un peu différemment. Vu que tes commandes s'appliquent sur les objets métier de ta ListView, je ferais un ViewModel pour les objets remplissant ta ListView. Dans ce ViewModel, tu mettrais les commandes en question et tu ne remplirais plus ta ListView avec tes objets métiers mais avec tes objets ViewModel. Et le Binding serait plus classique.

    [Edit] Ouep un peu de retard pour le coup...

  19. #19
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    bin en fait j ai des objet EF qui forme un gros graphe de plusieurs entités liés entre elle (y a une listview dans une listview)

    Donc injecter une armada de viewmodel au milieu de tout ça me déplait bon je crois que j ai trouvé ma piste en restant sur les ressources ... je viendrais pleurer si ca marche pas

    Merci pour les conseils c'était très instructif

Discussions similaires

  1. MVVM - Events envoyés par un ViewModel
    Par dotixx dans le forum C#
    Réponses: 3
    Dernier message: 13/11/2012, 08h41
  2. [C#][MVVM] Event Singleton (variable pour l'application)
    Par Monkey56 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 13/09/2010, 14h42
  3. Question MVVM - Event - Command
    Par obito dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 20/08/2010, 15h45
  4. [MVVM]Accèder aux Commands d'un VM depuis un Ribbon
    Par Krustig dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 09/06/2009, 22h10
  5. [Visual C++] Add build events et command line
    Par cfrelet dans le forum MFC
    Réponses: 6
    Dernier message: 11/05/2006, 11h32

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