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 :

comment récupérer un element dans un listbox via un template d'element


Sujet :

Windows Presentation Foundation

  1. #1
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut comment récupérer un element dans un listbox via un template d'element
    bonjour

    j'ai un listbox dans lequel j'ajoute des elements typés une classe non graphique
    j'ai un template pour cet element sur lequel il y entre autre un bouton
    sur ce bonton j'accroche un évènement via xaml sur le click

    comment récupérer l'élément dans le code behind pour pouvoir faire un traitement sur l'instance ??



    question subsidiaire, je voudrais que mon bouton ne soit visible que quand ma souris est sur l'element
    template : grid (image textblock button)
    j'ai essayé un style avec un trigger sur grid.ismouseover mais ca n'a pas l'air de se délencher

    merci
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  2. #2
    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
    Salut,

    Citation Envoyé par sperot51
    comment récupérer l'élément dans le code behind pour pouvoir faire un traitement sur l'instance ??
    Une solution rapide serait de mettre dans la propriété Tag du bouton l'élément en question. El dans l'événement clic du bouton, en castant le sender, tu pourras récupérer ce fameux Tag et donc ton élément.


    Citation Envoyé par sperot51
    question subsidiaire, je voudrais que mon bouton ne soit visible que quand ma souris est sur l'element
    template : grid (image textblock button)
    j'ai essayé un style avec un trigger sur grid.ismouseover mais ca n'a pas l'air de se délencher
    Je me demande si tu ne dois pas mettre un background pour que cela fonctionne... Teste vite fait avec background et si j'ai raison, utilise un background très très transparent mais pas totalement

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    le tag j'y avais pensé, mais ca fait moyennement propre
    m'enfin ca marche oui

    pour le background je comprends pas trop ce que tu dis
    j'ai déjà vu des webcasts où des boutons apparaissent quand la souris passe sur l'élément c'est que ca doit etre faisable
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    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
    pour le background je comprends pas trop ce que tu dis
    j'ai déjà vu des webcasts où des boutons apparaissent quand la souris passe sur l'élément c'est que ca doit etre faisable
    Je suis pas sûr de ce que j'avance, mais si tu mets un background (autre que transparent) à ta Grid sur laquelle tu vérifies le IsMouseOver est-ce que cela fonctionne ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    sperot, si tu utilises le e.source dans ton evenement, ne peux tu pas remonter sur son parent ? ou un truc dans ce gout là.

    Pour ton histoire d'apparition de bouton, je te conseillerai d'utiliser Blend pour comprendre comment cela fonctionne. J'ai appris pas mal de choses avec
    Il est possible que ton Trigger ne soit pas appliqué au bon élément. Creuses dans cette direction. (d'ailleurs le style comportant ton trigger est appliqué sur quoi ? sur le grid ? si oui, essayes de le faire sur autre chose, un élément contenu dans ta grille par exemple, pour le test)

  6. #6
    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 binoo Voir le message
    Je suis pas sûr de ce que j'avance, mais si tu mets un background (autre que transparent) à ta Grid sur laquelle tu vérifies le IsMouseOver est-ce que cela fonctionne ?
    En fait, peut importe la couleur que tu assignes tant que tu changes l'alpha

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    mon style est appliqué sur le bouton, c'est ptete là que ca cloche, je devrais peut etre le mettre sur le grid
    enfin wpf n'est pas très intuitif, une fois qu'on a compris un fonctionnement, on en voit la puissance et on arrive à le réécrire mais ca reste beaucoup de recherche ...


    je suis en train de partir sur un autre concept, les commandes, vu que le but c'est que quand je clic sur mon bouton (qui fait partie du template d'une classe non graphique) je veux executer une sub en rapport avec mon instance dans le listbox
    avec click="" on peut mettre une sub dans le form, mais je voudrais plutot appeler une sub sur l'instance, mais je ne vois pas comment, et je suis pas sur que les wpf commands répondent à ce besoin, j'ai du mal à cerner comment ca fonctionne dans les exemples que je trouve

    Code xml : 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
     
     
    <DataTemplate DataType="{x:Type db:Database}">
        <Grid Margin="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="30"/>
                <ColumnDefinition />
                 <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Image  Width="20" Height="20"  Grid.Column="0" Source="/Resources/DataBase.png"/>
            <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center"  Grid.Column="1" Text="{Binding Path=Name}"/>
            <Button    Margin="4" Grid.Column="2" >
         <!-- <Button.Style >
                    <Style>
                        <Style.Triggers >
                            <Trigger Property="Grid.IsMouseOver" Value="True">
                                <Setter Property="Button.Visibility" Value="Visible"/>
                            </Trigger>
                                <Trigger Property="Grid.IsMouseOver" Value="False">
                                <Setter Property="Button.Visibility" Value="Hidden"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Button.Style>-->
                <Image  Width="20" Height="20" Source="/Resources/save.png"/>
            </Button>
        </Grid>
    </DataTemplate>

    au passage ca serait bien si le forum pouvait nous mettre en page le xaml !
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Les commandes risquent d'etre tout à fait adaptées à ton besoin.
    Il faut savoir qu'elles ne se placent pas sur l'attribut Click mais sur l'attribut Command.

    Perso j'utilise tout le temps les commandes (exit les evenements !) et dans ton cas, il faudrait que tu utilises le binding pour recuperer la commande de l'item. Donc dans ton template cela donnerai quelque chose dans ce gout là :

    <button command={binding MaCommande}>Click me</Button>

    où MaCommande est une propriété de ton instance bindée sur le listboxitem.

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    Citation Envoyé par zax-tfh Voir le message
    où MaCommande est une propriété de ton instance bindée sur le listboxitem.

    hein ?



    et la commande je l'écris sur ma classe ?
    faut implémenter ICommand ? sur ma classe ? sur une classe qui ne fait que la commande ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Beh tout dépend de ce que tu veux faire.
    Imaginons une classe MaClasse
    Imaginons une liste MaListe = List(Of MaClasse)

    Tu binde MaListe sur ton listbox.
    Dans ton itemtemplate tu as un bouton par ligne (en gros un bouton par occurence de MaClasse)
    Si tu veux que ton bouton agisse sur les données de ton occurence (de ta ligne), il faut effectivement que tu aies une commande à l'interieur de MaClasse.

    Pour l'implémentation d'une commande, je te recommande l'excellente classe créée par je ne sais plus qui qui s'appelle RelayCommand.

    Entraines toi d'abord sur un projet tout simple avec un bouton et une commande, c'est préférable pour commencer.

    Concernant le principe de la relayCommand :

    Tu as ton objet de type MaClasse qui est bindée à ton xaml (datacontext, element de listbox, ou autre,peut importe)
    Dans cette classe, tu as une propriété qui retourne un relaycommand.

    Ca ressemble à ca en VB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private C_OuvrirProjet As New RelayCommand(AddressOf OuvrirProjet, AddressOf PeutOuvrirProjet)
        Public ReadOnly Property COuvrirProjet() As ICommand
            Get
                Return C_OuvrirProjet
            End Get
        End Property
    Dans ton xaml, au niveau du bouton tu fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <button command={Binding COuvrirProjet}>Ouvrir</Button>
    En cliquant sur le bouton ca va recuperer la commande, et lancer la sub "OuvrirProjet" (que l'on a indiqué par le "Addressof OuvrirProjet" dans le new du relaycommand)

    En plus, ce concept est génial car tu as la fonction PeutOuvrirProjet qui doit retourner un boolean. Donc en gros, c'est toi qui dit quand est-ce que le bouton peut etre cliquable ou pas (selon le contexte de ton objet)

    Des questions ?

    Edit : D'après ce que je comprend, tu n'utilises pas le design pattern MVVM. Donc petit conseil au passage, jettes-y un oeil ! tu vas voir c'est que du bonheur ^^

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    ca a pas l'air de fonctionner

    template (qui s'affiche bien) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <Button    Margin="4" Grid.Column="2"  Command = "{Binding Save}">
    mon implémentation perso du RelayCommand ^^ :

    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
     
    Public Class RelayCommand
        Implements ICommand
     
        Public Delegate Sub ExecuteDelegate(ByVal Parameter As Object)
        Public Delegate Sub CanExecuteDelegate(ByVal Parameter As Object)
     
        Private _execute As [Delegate]
        Private _canexecute As [Delegate]
     
     
        Public Sub New(ByVal execute As ExecuteDelegate)
            Me.New(execute, Nothing)
        End Sub
     
        Public Sub New(ByVal execute As ExecuteDelegate, ByVal canExecute As CanExecuteDelegate)
            If execute Is Nothing Then Throw New ArgumentNullException("execute")
     
            _execute = execute
            _canexecute = canExecute
        End Sub
     
     
     
        Public Sub Execute(ByVal parameter As Object) Implements System.Windows.Input.ICommand.Execute
            _canExecute.Method.Invoke(Nothing, New Object() {parameter})
        End Sub
     
     
     
        Public Function CanExecute(ByVal parameter As Object) As Boolean Implements System.Windows.Input.ICommand.CanExecute
            If _canExecute Is Nothing Then Return True
            Return DirectCast(_canExecute.Method.Invoke(Nothing, New Object() {parameter}), Boolean)
        End Function
     
        Public Event CanExecuteChanged(ByVal sender As Object, ByVal e As System.EventArgs) Implements System.Windows.Input.ICommand.CanExecuteChanged
     
    End Class
    le code de ma classe templatée :
    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
     
    Namespace DBClasses
     
        Public Class DataBase
     
            Public Sub New(ByVal DB As Microsoft.SqlServer.Management.Smo.Database)
                _SmoDataBase = DB
            End Sub
     
     
            Private _SmoDataBase As Microsoft.SqlServer.Management.Smo.Database
            Public ReadOnly Property SmoDataBase() As Microsoft.SqlServer.Management.Smo.Database
                Get
                    Return _SmoDataBase
                End Get
            End Property
     
            Public ReadOnly Property Name() As String
                Get
                    Return SmoDataBase.Name
                End Get
            End Property
     
     
            Private _CommandSave As New RelayCommand(AddressOf Save, AddressOf CanSave)
            Public ReadOnly Property CommandSave() As ICommand
                Get
                    Return _CommandSave
                End Get
            End Property
     
            Private Sub Save(ByVal Parameter As Object)
     
            End Sub
     
            Private Sub CanSave(ByVal Parameter As Object)
     
            End Sub
     
     
        End Class
     
    End Namespace
    sur la ligne Private _CommandSave As New RelayCommand(AddressOf Save, AddressOf CanSave) ca passe bien en debug dans le new de mon RelayCommand


    par contre sur le clic du bouton il se passe rien ...
    (certes les subs sont vides mais j'ai mis des points d'arret)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    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
    Sur le binding, il faut mettre la propriété et non la méthode. Donc en essayant de déchiffrer le vb (dsl), je dirais que c'est plutot CommandSave que Save.

    soit quelque chose comme ça :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <Button Margin="4" Grid.Column="2" Command="{Binding CommandSave}" >


    au passage ca serait bien si le forum pouvait nous mettre en page le xaml !
    Tu peux ajouter "=xml" dans la balise CODE pour que ce soit plus lisible, comme tu l'a peut être fait pour le code vb avec "=vb" ou le code c# avec "=c#"

  13. #13
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    ah oui j'suis con ca marche mieux en effet

    par contre mon implémentation du relaycommand est pas encore top, m'enfin ca devrait aller

    merci à tous
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    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
    Tu as dans le lien qui suit l'implémentation de la classe RelayCommand (figure 3) faite par son auteur, Josh Smith. L'article est d'ailleurs excellent :
    http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Sperot, sincerement réutilise la classe de Josh Smith, ne réinvente pas la poudre, tu verras que dans les projets c'est un bonheur de l'utiliser (cf mon code plus haut, tu vois qu'il n'y a que la définition d'une property en readonly avec initialisation de son attribut (le new RelayCommand) et ensuite y'a plus qu'à créer la sub d'execution et la function de test de faisabilité....

    En plus la classe de Josh prend en charge les commandes sans argument mais aussi celles avec arguments ! c'est pas wonderful ça ?

    Tu trouveras sa classe plus complete que celle de l'article de Krosoft ici : http://www.codeproject.com/KB/WPF/In...zedWizard.aspx

  16. #16
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    je comprends tout à fait oui

    mais je voulais que l'intellisense me propose adresseof et pour ca il me fallait une variable delegué

    je sais je chipote m'enfin c'est juste l'invoke qui passe pas, rien de bien grave je pense, je regarderais demain ce que j'ai raté

    sinon en effet je reprendais sa classe l'intellisense c'est pas primordial non plus
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Pour info, l'intellisense fonctionne très bien chez moi il me propose l'adressof, le nom de la sub et tout le toutim

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

Discussions similaires

  1. [Sécurité] comment récupérer le subject dans une page jsp?
    Par lalakers dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 13/07/2005, 11h42
  2. Comment récupérer l'indice dans un TdxTreeList ?
    Par claude dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/12/2004, 15h17
  3. MAKEFILE : Comment récupérer l'OS dans le makefile
    Par nana1 dans le forum Systèmes de compilation
    Réponses: 12
    Dernier message: 14/09/2004, 16h23
  4. [debutant] supprimer elements dans une listbox
    Par F.F. dans le forum C++Builder
    Réponses: 8
    Dernier message: 02/07/2004, 11h38
  5. Réponses: 6
    Dernier message: 30/04/2004, 15h53

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