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

C# Discussion :

[C#][WPF] Comment avoir 2 ComboBox avec une valeur différente à partir du même ItemSource ?


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [C#][WPF] Comment avoir 2 ComboBox avec une valeur différente à partir du même ItemSource ?
    Bonjour,

    Je débute un peu dans le WPF en .NET, et je connais plus le WindowsForms.
    Mon problème est comment faire pour que 2 combobox qui possèdent le même ItemSource ne puissent pas sélectionner la même valeur.

    Pour le contexte, je veux créer/modifier un objet "Transfert", qui correspond au transfert d'un montant entre deux objets "Compte". Cette édition se fait dans une modal (fenêtre). Il ne faut donc pas pouvoir sélectionner le même compte source et destinataire dans les 2 combobox.
    L'ItemSource est un model avec une ObservableCollection d'objet "Compte". L'ItemSource est attribué aux 2 combobox dans le code C# lors du chargement de la fenêtre.

    Voici le code XAML des deux combobox, si l'évènement SelectionChanged est utilisé c'est que j'ai d'autres traitements particulier à faire qui n'impactent pas la sélection d'un compte (destinataire ou source):
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <Syncfusion:ComboBoxAdv x:Name="cbxCompteSource" Grid.Column="1" Grid.Row="4" Margin="5" SelectionChanged="cbxCompteSource_SelectionChanged" >
            <Syncfusion:ComboBoxAdv.ItemTemplate>
                    <DataTemplate>
                        <TextBlock>
                            <TextBlock.Text>
                                <MultiBinding StringFormat=" {0} ({1} €)">
                                    <Binding Path="Libelle"/>
                                    <Binding Path="Solde"/>
                                </MultiBinding>
                            </TextBlock.Text>
                        </TextBlock>
                    </DataTemplate>
            </Syncfusion:ComboBoxAdv.ItemTemplate>
    </Syncfusion:ComboBoxAdv>
    <Syncfusion:ComboBoxAdv x:Name="cbxCompteDestinataire" Grid.Column="1" Grid.Row="5" Margin="5" SelectionChanged="cbxCompteDestinataire_SelectionChanged" >
            <Syncfusion:ComboBoxAdv.ItemTemplate>
                    <DataTemplate>
                        <TextBlock>
                            <TextBlock.Text>
                                <MultiBinding StringFormat=" {0} ({1} €)">
                                    <Binding Path="Libelle"/>
                                    <Binding Path="Solde"/>
                                </MultiBinding>
                            </TextBlock.Text>
                        </TextBlock>
                    </DataTemplate>
            </Syncfusion:ComboBoxAdv.ItemTemplate>
    </Syncfusion:ComboBoxAdv>
    Pour information j'utilise Syncfusion, mais le fonctionnement des combobox est similaire, si il le faut je mettrai des combobox "standard" mais normalement les paramètres/évènements sont identiques.
    Je mettrai le DataTemplate dans une ressource pour éviter la répétition du code plus tard.

    Pour l'instant j'ai essayé Filter mais le problème c'est qu'à chaque changement il faut le changer et que la combobox désélectionne l'item.
    Puis j'ai essayé de chercher avec MultiDataTrigger.Conditions mais j'ai du mal à comprendre, et si ça pourrait être une solution.

    Merci pour votre aide.

  2. #2
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 200
    Points : 962
    Points
    962
    Par défaut
    Bonsoir,

    Il faut utiliser la propriété SelectedItem de la combobox avec du binding comme ceci :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <Syncfusion:ComboBoxAdv x:Name="cbxCompteSource" Grid.Column="1" Grid.Row="4" Margin="5" Selecteditem="{Binding SelectedCompteSource}">
            <Syncfusion:ComboBoxAdv.ItemTemplate>
                    <DataTemplate>
                        <TextBlock>
                            <TextBlock.Text>
                                <MultiBinding StringFormat=" {0} ({1} €)">
                                    <Binding Path="Libelle"/>
                                    <Binding Path="Solde"/>
                                </MultiBinding>
                            </TextBlock.Text>
                        </TextBlock>
                    </DataTemplate>
            </Syncfusion:ComboBoxAdv.ItemTemplate>
    </Syncfusion:ComboBoxAdv>
    <Syncfusion:ComboBoxAdv x:Name="cbxCompteDestinataire" Grid.Column="1" Grid.Row="5" Margin="5" Selecteditem="{Binding SelectedCompteDestination}">
            <Syncfusion:ComboBoxAdv.ItemTemplate>
                    <DataTemplate>
                        <TextBlock>
                            <TextBlock.Text>
                                <MultiBinding StringFormat=" {0} ({1} €)">
                                    <Binding Path="Libelle"/>
                                    <Binding Path="Solde"/>
                                </MultiBinding>
                            </TextBlock.Text>
                        </TextBlock>
                    </DataTemplate>
            </Syncfusion:ComboBoxAdv.ItemTemplate>
    </Syncfusion:ComboBoxAdv>

    En WPF on code en respectant le pattern MVVM

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Ca a peut être un rapport avec IsSynchronizedWithCurrentItem.

  4. #4
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par WDKyle Voir le message
    Bonsoir,

    Il faut utiliser la propriété SelectedItem de la combobox avec du binding comme ceci :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <Syncfusion:ComboBoxAdv x:Name="cbxCompteSource" Grid.Column="1" Grid.Row="4" Margin="5" Selecteditem="{Binding SelectedCompteSource}">
            <Syncfusion:ComboBoxAdv.ItemTemplate>
                    <DataTemplate>
                        <TextBlock>
                            <TextBlock.Text>
                                <MultiBinding StringFormat=" {0} ({1} €)">
                                    <Binding Path="Libelle"/>
                                    <Binding Path="Solde"/>
                                </MultiBinding>
                            </TextBlock.Text>
                        </TextBlock>
                    </DataTemplate>
            </Syncfusion:ComboBoxAdv.ItemTemplate>
    </Syncfusion:ComboBoxAdv>
    <Syncfusion:ComboBoxAdv x:Name="cbxCompteDestinataire" Grid.Column="1" Grid.Row="5" Margin="5" Selecteditem="{Binding SelectedCompteDestination}">
            <Syncfusion:ComboBoxAdv.ItemTemplate>
                    <DataTemplate>
                        <TextBlock>
                            <TextBlock.Text>
                                <MultiBinding StringFormat=" {0} ({1} €)">
                                    <Binding Path="Libelle"/>
                                    <Binding Path="Solde"/>
                                </MultiBinding>
                            </TextBlock.Text>
                        </TextBlock>
                    </DataTemplate>
            </Syncfusion:ComboBoxAdv.ItemTemplate>
    </Syncfusion:ComboBoxAdv>

    En WPF on code en respectant le pattern MVVM
    Merci je me suis renseigné sur le pattern MVVM, et je vais mettre à jour mon application à ce niveau.

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par micka132 Voir le message
    Ca a peut être un rapport avec IsSynchronizedWithCurrentItem.
    J'ai regardé et fait quelque test dans une application à part, mais cela ne pas correspond à mon objectif. IsSynchronizedWithCurrentItem permet que si je sélectionne un élément dans une de mes combo-box l'autre combo-box qui a le même ItemSource sélectionne également cet élément. Or mon objectif est d'empêcher que les 2 combo-box sont la même valeur.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    de mémoire, quand on bind à une collection, wpf créé un collectionviewsource qui devient de le collectionviewsource par défaut pour la collection
    le collectionviewsource sert entre autre à gérer l'élément sélectionné
    il te faut donc créer au moins un collectionviewsource en plus, et donc binder au collectionviewsource le 2eme combo ou les 2 combos à 2 collectionviewsource
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2021
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2021
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    de mémoire, quand on bind à une collection, wpf créé un collectionviewsource qui devient de le collectionviewsource par défaut pour la collection
    le collectionviewsource sert entre autre à gérer l'élément sélectionné
    il te faut donc créer au moins un collectionviewsource en plus, et donc binder au collectionviewsource le 2eme combo ou les 2 combos à 2 collectionviewsource
    D'accord c'est ce dont j'avais peur. Je vais donc modifier mon modèle, qu'il aura deux collections au lieu d'une. Merci pour votre aide et conseil à tous.

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2015
    Messages : 66
    Points : 63
    Points
    63
    Par défaut
    Bonjour,

    Effectivement, je pense également qu'il te faut deux listes.

    La première : comprend l'ensemble de tes données
    La seconde : comprend l'ensemble de tes données MOINS celle sélectionnée dans ton premier cbBox

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

Discussions similaires

  1. Initialiser un Combobox avec une valeur vide
    Par andyajram dans le forum Développement Windows
    Réponses: 1
    Dernier message: 26/12/2017, 16h24
  2. [AC-2007] Sélectionner un item d'une combobox avec une valeur?
    Par Vhalar dans le forum VBA Access
    Réponses: 1
    Dernier message: 08/09/2011, 22h07
  3. Combobox Ajouter une valeur a partir des choix
    Par bullrot dans le forum C++Builder
    Réponses: 3
    Dernier message: 23/11/2007, 19h31
  4. [ComboBox] Retourner une valeur différente de ComboBox.Text
    Par nicolas.pied dans le forum Windows Forms
    Réponses: 4
    Dernier message: 03/02/2007, 20h01
  5. avoir un champ avec une valeur numerique qui se decremente
    Par romeo9423 dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 15/02/2005, 14h29

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