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

Silverlight Discussion :

Command dans une DataGrid


Sujet :

Silverlight

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut Command dans une DataGrid
    Bonjour

    je souhaite faire une datagrid avec pour chaque ligne un bouton pour "sélectionner" la ligne et valider son choix.

    Seulement voila, avec l'utilisation de mvvm et du "command", ça ne fonctionne pas..

    voici mon code côté view model:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            private void instancierMaCommande()
            {
                maCommande= new RelayCommand<objetBinde>(ExecuteMaCommande);
            }
     
            public ICommand maCommande{ get; internal set; }
     
            public void ExecuteMaCommande(objetBinde param)
            {
                  //.... là où je souhaite arriver avec mon paramètre...
                  //objetBinde est le type d'objet utilisé dans l'observableCollection bindée à madatagrid..
            }
    (bien entendu "instancierMaCommande" est appelé dans mon constructeur par défaut..)

    côté IHM voici ma datagrid:
    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
    <sdk:DataGrid x:Name="dg" AutoGenerateColumns="False" ItemsSource="{Binding maListe}" >
                        		<sdk:DataGrid.Columns>
                                    <sdk:DataGridTextColumn Binding="{Binding Numero}" Header="Num" />
                                    <sdk:DataGridTextColumn Binding="{Binding Nom}" Header="Nom" Width="100"/>
                                    <sdk:DataGridTemplateColumn>
                                        <sdk:DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate>
                                                <Button x:Name="monBtn" Content="choisir" >
                                                    <i:Interaction.Triggers>
                                                        <i:EventTrigger EventName="Click">
                                                            <i:InvokeCommandAction Command="{Binding Path=maCommande}" CommandParameter="{Binding SelectedItem, ElementName=dg} " />
                                                        </i:EventTrigger>
                                                    </i:Interaction.Triggers>
                                                </Button>
                                            </DataTemplate>
                                        </sdk:DataGridTemplateColumn.CellTemplate>
                                    </sdk:DataGridTemplateColumn>
                        		</sdk:DataGrid.Columns>
                        	</sdk:DataGrid>
    voilà je sais que l'erreur vient du binding à ma command mais je ne sais pas comment la résoudre..

  2. #2
    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 : 39
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Essaie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Command="{Binding Path=DataContext.maCommande, ElementName=dg}"

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    désolé ça ne fonctionne pas..

  4. #4
    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 : 39
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par johnaliashead Voir le message
    désolé ça ne fonctionne pas..
    Peux tu détailler?
    L'idée serait de rajouter un converter de debug sur lequel tu puisses te brancher.
    http://blogs.msdn.com/b/wpfsldesigne...plication.aspx

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    dans la fenêtre de sortie après quelques seconde j'ai
    Le thread '<Sans nom>' (0xd90) s'est arrêté avec le code 0 (0x0).
    puis d'autres arrivent encore quelques secondes après..

    pourtant les autres champs de mon tableau s'affichent bien donc le dataContext est bon, et j'ai bien vérifié ma commande est bien déclarée côté viewModel ..

    y a t il un moyen simple et efficace pour arriver a faire marcher cette commande?

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

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Ah mais oui! Je crois que y'a un bug, le ElementName ne fonctionne pas dans un binding qu'est dans un DataGrid (j'ai entendu ca une fois).

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    mais dans ce cas comment faire ? après peut importe le procédé, mais juste afficher un bouton par ligne et executer une commande avec paramètres ça doit être possible quand même ?

  8. #8
    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 : 39
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par johnaliashead Voir le message
    mais dans ce cas comment faire ? après peut importe le procédé, mais juste afficher un bouton par ligne et executer une commande avec paramètres ça doit être possible quand même ?

    La solution est que la commande ne soit pas sur le viewmodel global mais plutot qu'il y'ait une commande sur chaque ligne.

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    et comment mettre ça en place. as tu un exemple?

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 199
    Par défaut
    c'est bon j'ai fait une autre méthode, que je trouve assez moche mais qui fonctionne :
    je binde la propriété "ItemSelected" de ma datagrid a un objet dans mon viewModel.
    Pour mes boutons, au clic, j'ai une méthode dans "maPage.xaml.cs" qui appelle mon viewModel via "Locator.MonViewModelStatic.maMethode()"..

  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 : 39
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par johnaliashead Voir le message
    c'est bon j'ai fait une autre méthode, que je trouve assez moche mais qui fonctionne :
    je binde la propriété "ItemSelected" de ma datagrid a un objet dans mon viewModel.
    Pour mes boutons, au clic, j'ai une méthode dans "maPage.xaml.cs" qui appelle mon viewModel via "Locator.MonViewModelStatic.maMethode()"..
    Tu peux utiliser les triggers sinon (dans le sdk expression blend) ca a l'avantage est que tout se fait dans le xaml

  12. #12
    Membre émérite
    Homme Profil pro
    Développeur / architecte
    Inscrit en
    Juillet 2009
    Messages
    473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur / architecte

    Informations forums :
    Inscription : Juillet 2009
    Messages : 473
    Par défaut
    Citation Envoyé par johnaliashead Voir le message
    c'est bon j'ai fait une autre méthode, que je trouve assez moche mais qui fonctionne :
    je binde la propriété "ItemSelected" de ma datagrid a un objet dans mon viewModel.
    Pour mes boutons, au clic, j'ai une méthode dans "maPage.xaml.cs" qui appelle mon viewModel via "Locator.MonViewModelStatic.maMethode()"..
    Sinon, il y a une solution assez élégante ici. En gros on récupère le DataContext à travers un objet ( datacontextproxy ) en resource du control.
    Je faisais comme toi jusqu'au jour où j'ai eu besoin de faire ça dans un childwindow (sachant que je gère le binding dans un dialog manager, et n'ai donc pas le DataContext ni dans un locator, ni dans un viewmodel dans les resources)

  13. #13
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 66
    Par défaut
    Hello,

    Je plussoie la solution de chrisdot.
    A titre informatif j'ai fait une version utilisant le framework nRoute. Implémenter la même chose en custom est très simple et rejoint à peu de choses près la solution de chrisdot.

    Tout ce passe ici côté Xaml :



    A - On créer une CommandRelay (ne pas confondre avec RelayCommand du MVVMLight) en ressource du UserControl. L'avantage des ressources c'est qu'elles sont accessibles dans toutes les feuilles de ton arbre visuels, DataTemplate compris.
    Cette CommandRelay va servir à enregistrer une commande définie dans le viewmodel en ressource.

    B - On map le view model (équivalent à UserControl.DataContext = new ViewModel())

    C - Ce behavior permet d'enregistrer la commande en fichier de ressource (la même chose est faisable en code behind). Ici on dis : "Met moi la commande ShowAuthorCommand dans la ressource ShowAuthorCommandRelay".

    D - On Invoque la commande lors du clic du bouton dans notre DataGrid. La commande que l'on a enregistrée précédemment est accessible via la propriété Command du CommandRelay. Dans le binding on précise que la commande se trouve dans ShowAuthorCommandRelay grâce à la propriété Source.

    Et voilà c'est fini.

    A titre d'infos j'ai uploadé le code source de cette petite démo sur mon skydrive ici => http://cid-4fcd8d9fd7881953.office.l...ayCommands.zip

    Et je t'invite à aller voir les source du framework nRoute si tu veux reproduire ce qu'il propose sans l'utiliser. C'est assez simple à faire.

    Bon courage pour la suite.

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

Discussions similaires

  1. Entrer des commandes dans une CMD
    Par narsi1 dans le forum C++
    Réponses: 16
    Dernier message: 03/03/2005, 15h10
  2. Afficher une dropdownlist lors de modif dans une DataGrid
    Par MiJack dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/11/2004, 17h42
  3. [VB.NET] Disparition scrollBar dans une DataGrid
    Par aphykite dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/10/2004, 10h29
  4. Pb d'update dans une DataGrid
    Par bidson dans le forum XMLRAD
    Réponses: 11
    Dernier message: 27/05/2003, 14h11

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