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 :

[WPF] Combobox qui affiche un enum et un checkbox


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 352
    Points : 136
    Points
    136
    Par défaut [WPF] Combobox qui affiche un enum et un checkbox
    Bonjour,

    Je créé un jeu de rôle en WPF, et j’aurai besoin d’un combobox qui affiche un enum et un checkbox sur chaque item. J’ai créé un combobox avec un DataTemplate dont voici le XAML :
    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
                                    <ComboBox Margin="5,0,0,0" HorizontalContentAlignment="Stretch" 
                                              ItemsSource="{Binding Source={StaticResource enumArmes}}" 
                                              SelectedValue="{Binding Path=TheCaballero.Arme}"
                                              >
                                        <ComboBox.ItemTemplate>
                                            <DataTemplate>
                                                <Grid>
                                                    <Grid.ColumnDefinitions>
                                                        <ColumnDefinition Width="150"></ColumnDefinition>
                                                        <ColumnDefinition></ColumnDefinition>
                                                    </Grid.ColumnDefinitions>
                                                    <TextBlock Grid.Column="0" Text="{Binding Converter={StaticResource MyEnumConverter}}"/>
                                                    <CheckBox Grid.Column="1" ></CheckBox>
                                                </Grid>
                                            </DataTemplate>
                                        </ComboBox.ItemTemplate>
                                    </ComboBox>

    Pour l’enum j’arrive à l’afficher grâce à un ObjectDataProvider. Le checkbox est affiché grâce au DataTemplate.

    Mon soucis, c’est que j’aimerai cocher un checkbox qui alimente un objet avec la valeur true.

    L’idée, c’est que le combobox énumère la liste complète des armes que le héro peut avoir, et que je puisse cocher celles qu’il achète au fur et à mesure. Mais je ne sais pas dans quel type d’objet représenter ça pour qu’il soit lié avec les notifications de changement ? Un ObservableCollection ne prend qu’un argument à priori, et un Dictionary pourrait peut etre répondre à mon besoin, mais je ne sais pas comment le rendre lié avec l’enum et les bool (des checkbox) pour qu’il notifie les changements.

  2. #2
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 895
    Points : 1 911
    Points
    1 911
    Par défaut
    Tu as sûr que ce que tu veux c'est une ComboBox et pas une popup avec une ListBox ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2021
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Reponse ComboBox avec checkbox
    Je pense que l'idée du Dictionnary<int,bool> est la bonne.
    Tu peux dans le code behind itérer sur les valeurs de l'enum pour créer ton dictionnaire avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var values = Enum.GetValues(typeof(****TonEnum***));
    ensuite tu mets le dictionnaire en itemSource
    pour le binding du text tu met Binding Key
    et pour la checkbox Binding Value

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Citation Envoyé par Ticoche Voir le message
    Bonjour,

    L’idée, c’est que le combobox énumère la liste complète des armes que le héro peut avoir, et que je puisse cocher celles qu’il achète au fur et à mesure. Mais je ne sais pas dans quel type d’objet représenter ça pour qu’il soit lié avec les notifications de changement ? Un ObservableCollection ne prend qu’un argument à priori, et un Dictionary pourrait peut etre répondre à mon besoin, mais je ne sais pas comment le rendre lié avec l’enum et les bool (des checkbox) pour qu’il notifie les changements.
    Le dictionary est une mauvaise piste ....meme s'il peut etre bindé en WPF.
    Pour avoir des Notifications de changement de proprieté :
    il faut un class T qui implemente INotifyPropertyChanged

    Pour avoir des Notifications de changement de collection (ajout,suppression,modification):
    il faut une ObservableCollection<T>

    pour plus de clarté voici un exemple qui fonctionne comme un charme:
    1/ code des class Data
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    using System;
    using System.ComponentModel;
    using System.Collections.ObjectModel;
     
    namespace WpfSoldatRoles
    {
        public class ItemBase:INotifyPropertyChanged 
    	{
     
            public event PropertyChangedEventHandler PropertyChanged;
            public void RaisePropertyChanged(string propName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propName));
                }
            }
        }
     
        // Un  class "armé"  de pied en cap
        public class ItemArme:ItemBase 
        {
            private bool available;
     
            public bool Available
            {
                get { return available; }
                set { available = value; RaisePropertyChanged("Available"); }
            }
            private TypeArme typearme;
     
            public TypeArme TypeArme
            {
                get { return typearme; }
                set { typearme = value; RaisePropertyChanged("TypeArme"); }
            }
     
     
     
            public ItemArme ()
            {}
            public ItemArme(bool available,TypeArme  typearme):this()
            {
                this.Available = available; this.TypeArme = typearme;
            }
        }
        // un  class soldat  
        public class Item:ItemBase 
        {
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; RaisePropertyChanged("Name");  }
            }
            private ObservableCollection <ItemArme> listArmes;
            public ObservableCollection <ItemArme> ListArmes 
            {
                get { return listArmes; }
                set { listArmes = value; RaisePropertyChanged("ListArmes"); }
            }
     
            public Item()
            {
                ListArmes = new ObservableCollection<ItemArme>() { 
                   new ItemArme (false,TypeArme.Bazooka)  ,
                   new ItemArme (false,TypeArme.FM),
                  new ItemArme (false,TypeArme.Grenade),
                  new ItemArme (false,TypeArme.Pistolet)
                };
            }
        }
        public class Items : ObservableCollection<Item>
        {
            public Items()
            {
                this.Add(new Item() { Name = "item1" });
                this.Add(new Item() { Name = "item2" });
                this.Add(new Item() { Name = "item3"});
     
            }
        }
     
     
    }
    2/ code xaml (pas de code behind.cs):
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <Window x:Class="WpfSoldatRoles.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfSoldatRoles" 
            Title="Window1" Height="300" Width="300">
        <Window.DataContext>
            <local:Items></local:Items>
        </Window.DataContext>
        <Grid>
            <ListBox 
                    ItemsSource="{Binding }">
                <ListBox.ItemTemplate>
                    <DataTemplate >
                        <StackPanel Orientation="Horizontal" >
                            <TextBlock Margin="5" Text="{Binding Name}"/>
                            <!--un autre listbox tapi dans un expander-->
                            <Expander 
                                x:Name="myExpander" Background="Tan" 
                                HorizontalAlignment="Left" Header="My Expander" 
                                ExpandDirection="Down" IsExpanded="True" Width="100">
                                <ListBox Margin="5" ItemsSource="{Binding ListArmes}">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Margin="5" Text="{Binding TypeArme}"/>
                                            <CheckBox Margin="5" IsChecked="{Binding Available}" />
                                        </StackPanel>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>                     
                            </ListBox>
                            </Expander>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
     
            </ListBox>
        </Grid>
    </Window>

    bon code...

Discussions similaires

  1. [XL-2013] ComboBox qui affiche seulement certaines lignes d'une feuille
    Par cagodue dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/05/2020, 16h03
  2. [Débutant] Problème combobox qui affiche les valeurs(int) d'une table
    Par arngrimur dans le forum C#
    Réponses: 4
    Dernier message: 06/07/2011, 11h52
  3. Réponses: 2
    Dernier message: 20/05/2010, 13h35
  4. [XL-2003] Combobox qui ne veut pas afficher la valeur
    Par david_atx dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/07/2009, 17h37
  5. [TMS AdvStringGrid] ComboBox qui s'affiche immédiatement
    Par gabvalorem dans le forum Composants VCL
    Réponses: 2
    Dernier message: 10/07/2008, 11h57

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