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 :

Binding avec filtre dans un ListView


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut Binding avec filtre dans un ListView
    Bonjour à tous,

    Je suis dessus depuis 2 jours, je crois que j'ai tout essayé

    J'aimerais faire quelque chose comme ça :
    Nom : DataGrid.png
Affichages : 247
Taille : 3,9 Ko

    En fait, c'est une liste d' "intervenants".
    Un intervenant possède un id (caché), un type (Combobox) et un contact (Autocomplete).

    Le comportement est simple :
    - On clique sur ajouter => Un élément vide vient d'ajouter dans la liste.
    - On renseigne le type dans la Combobox, puis on saisit du texte dans l'AutoComplete => Le nom des contacts correspondants au type choisit s'affiche et on en choisit un.

    Rien à faire, l'autocomplete fonctionne mais lorsque je sauve, les datas "intervenants" sont vides ou non modifiées.
    Par contre, le type lui, est bien changé si je change la valeur du Combobos, c'est au niveau de l'autocomplete qu'il y a un souci.

    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
                    <ListView x:Name="lvInterv" ItemsSource="{Binding ElmtInfo.intervenants, Mode=TwoWay}" HorizontalAlignment="Stretch" Style="{StaticResource lvTrans}">
                        <ListView.View>
                            <GridView>
                                <GridViewColumn Width="Auto">
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <StackPanel Orientation="Horizontal">
                                                <ComboBox Grid.Column="0" x:Name="cbTypesInt" Margin="2" SelectedValue="{Binding typeInt}" HorizontalAlignment="Stretch" 
                            ItemsSource="{Binding Interv.ElmtsTypes.items, Source={StaticResource Locator}}" HorizontalContentAlignment="Stretch">
                                                    <i:Interaction.Triggers>
                                                        <i:EventTrigger EventName="SelectionChanged" >
                                                            <Classes:ActionCbb2AcbOnSelChange TargetObject="{Binding ElementName=acInterv}" />
                                                        </i:EventTrigger>
                                                    </i:Interaction.Triggers>
                                                </ComboBox>
                                                <Toolkit:AutoCompleteBox Grid.Column="1" x:Name="acInterv" Margin="2" FilterMode="None" IsTextCompletionEnabled="False"
    				        SelectedItem="{Binding ." Populating="acInterv_Populating" HorizontalAlignment="Stretch" >
                                                    <Toolkit:AutoCompleteBox.ItemTemplate>
                                                        <DataTemplate>
                                                            <StackPanel Orientation="Horizontal">
                                                                <Label Content="{Binding contact.id}" Width="30" Foreground="DarkGray" />
                                                                <Label Content="{Binding contact.firstName}" />
                                                                <Label Content="{Binding contact.lastName}" FontWeight="Bold" />
                                                            </StackPanel>
                                                        </DataTemplate>
                                                    </Toolkit:AutoCompleteBox.ItemTemplate>
                                                </Toolkit:AutoCompleteBox>
                                            </StackPanel>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                                </GridViewColumn>
                            </GridView>
                        </ListView.View>
                    </ListView>
    Avez vous une idée ?
    David.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    pour faire un filtre facilement avec wpf
    regarde du coté des collection source
    ICollectionSource
    tu as tout dedans
    tu bind ta collection normalement
    puis tu reccup le ICollectionSource
    et enfin tu active le filtre

    si tu veux un exemple je te le filerais
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  3. #3
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Salut Ikeas,

    Oui, j'ai déjà manipulé un ICollectionSource, je connais.
    Le soucis, c'est de greffer le Autocomplete au Binding de l'item complet du ListView (intervenant), et pas juste un se des sous élément (contact).
    Dans ce deuxième cas, j'y arrive, par contre, je ne récupère pas l'id de l'intervenant.

    Je n'arrive pas par exemple à lui dire {Binding .} et à son ItemTemplate, mettre contact.id. Ca ne fonctionne pas. Pas contre, dans le contenu, il affiche le ToString() de l'objet intervenant. C'est ça qui est étrange.
    Mais rien à faire pour le setter.
    David.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    j'ai pas bien tout compris a ce que tu veux faire
    tu peux pas me faire un projet pour m'expliquer pas seulement du code j'irais plus vite sur la compréhension
    IKEAS : Finalement je crois que c'est dans ses faiblesses que l'on y trouve a la fois de la force et a la fois de la richesse...
    ----------------------------------------------------
    Si vous avez du taf en wpf & design d'application sympa, contactez moi !!!!
    http://ultimatecorp.eu/wpf/

  5. #5
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bonjour Ikeas,

    Voilà, j'ai fait mon cas de figure de façon isolé et autonome (en vrai, je te rassure, c'est plus propre).
    WpfTests.zip

    A cause du poids, je n'ai pas pu mettre les nuget, mais il faut juste ajouter MVVMLight et DataAnnotations (CommonServiceLocator.1.3).
    Ah, et peut être le toolkit (dans la boite à outil, faite click droit / choisir des éléments) => AutocompleteBox, et en faire glisser un sur la fenêtre (pour le supprimer ensuite).

    Le cas de figure est d'ajouter un nouvel intervenant (btn ajouter), de filtrer sur un type (combobox), de choisir un intervenant (AutoComplete).

    Et le problème est que lorsque l'on clique sur le bouton valider, l'intervenant ajouté est vide, l'autocomplete ne l'a pas bindée au datacontext.

    [EDIT]
    Projet complet ici : https://mega.nz/#!OswSXZ4B!7d9311-ZG...nmSkuzDJo5xbK0
    David.

  6. #6
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bon, je me suis dit que c'était peut être l'AutoComplete qui déconnait, je me suis donc fait un exemple minimaliste avec juste un Combobox et un label (pour voir si la valeur changeait).
    Plus simple, tu meurs :
    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
                    <ListView x:Name="lvInterv" ItemsSource="{Binding ElmtInfo.intervenants, Mode=TwoWay}" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Style="{StaticResource lvTrans}">
                        <ListView.View>
                            <GridView>
                                <GridViewColumn>
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <StackPanel Orientation="Horizontal">
                                                <ComboBox x:Name="cbInt" Margin="2" SelectedItem="{Binding Path=., Converter={StaticResource AcbConverter}, Mode=TwoWay}" 
                                                    ItemsSource="{Binding Interv.Elmts.items, Source={StaticResource Locator}}" >
                                                    <ComboBox.ItemTemplate>
                                                        <DataTemplate>
                                                            <StackPanel Orientation="Horizontal">
                                                                <Label Content="{Binding Path=id}" Width="30" Foreground="DarkGray" />
                                                                <Label Content="{Binding Path=typeInt.name}" />
                                                                <Label Content="{Binding Path=contact.firstName}" />
                                                                <Label Content="{Binding Path=contact.lastName}" FontWeight="Bold" />
                                                            </StackPanel>
                                                        </DataTemplate>
                                                    </ComboBox.ItemTemplate>
                                                </ComboBox>
                                            </StackPanel>
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                                <GridViewColumn Width="Auto">
                                    <GridViewColumn.CellTemplate>
                                        <DataTemplate>
                                            <Label Content="{Binding id, Mode=OneWay}" />
                                        </DataTemplate>
                                    </GridViewColumn.CellTemplate>
                                </GridViewColumn>
                            </GridView>
                        </ListView.View>
                    </ListView>
    Et là, ça ne marche pas... Lorsque l'on change de valeur dans la CB, le label ne change rien.
    Il n'arrive même pas à mettre la CB sur le bon élément au chargement.
    J'ai mis un converter "AcbConverter" juste pour débugger (aucun traitement), et lors du Convert, le targetType, est de type "object", pas "intervenant". Je ne sais pas si c'est normal.
    Et de plus, il ne passe jamais par le ConvertBack.

    Est ce que quelque chose m'échappe dans la ListView ?
    David.

  7. #7
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut l'autocomplete peut-il binder l'objet instancié de l'item conteneur ?
    Même problème sur le DataGrid... Je crois que WPF ne sais pas attribuer un objet en deux temps.
    J'aimerais reprendre le souci de Zéro, je suis surement mal parti :

    Comment faire pour avoir un comportement et une interface comme l'image du premier post ? (le plus simplement possible)
    0. Un a un formulaire qui affiche l'objet P, qui a une liste de I.
    1. On clique sur "Ajouter", ça ajoute un élément de type I, mais VIDE (pas null) à la liste de données => Nouvelle ligne Ligne.
    2. Une fois dans la liste, on attribue à I un élément existant dans la BDD => I1.
    2bis. Aller hop, on est fou, on en met un 2ème et on l'attribue => I2.
    3. On valide le formulaire et, ho miracle, on retrouve P avec sa collection d'éléments I1 et I2.

    La particularité n'est pas de modifier un sous élément de l'objet bindé à DataGridRow mais l'objet lui même.

    Quelqu'un a déjà fait ça ?

    Merci d'avance.
    David.

Discussions similaires

  1. Modifier / Supprimer image avec SQLite dans une ListView
    Par monta007 dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 08/03/2012, 12h08
  2. Réponses: 1
    Dernier message: 18/08/2011, 15h08
  3. Filtrer un texte avec image dans une listView perso avec un ArrayAdapter
    Par vivelapsp dans le forum Composants graphiques
    Réponses: 1
    Dernier message: 18/07/2011, 09h50
  4. Binding avec ElementName dans un DataTemplate
    Par annalady dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 23/06/2008, 14h00
  5. Problème de filtre dans une ListView
    Par Thrud dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 30/04/2008, 16h10

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