Biding liste objet datagrid

Fermé
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021 - 19 mars 2021 à 20:23
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 - 20 mars 2021 à 13:06
Bonjour je suis entrain de faire un travail et dans mon travail je dois faire un biding dans ma datagrid pour y inserer des informations et ces données proviennent des fichiers.json tout le biding marche sauf que quand je fais le binding sur ma liste il ne marche pas dans la datagrid il affiche collection au lieu d'afficher les valeurs de ma liste j'aimerai savoir comment bien faire le biding sur une liste merci voici mon code :

j'ai mis la balise code parce que c'est du code xaml je n'ai pas trouvé des balises pour du code xaml


<Window x:Class="TP2_JeuxSociete.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TP2_JeuxSociete"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">


<Grid x:Name="gPrincipal">
<TabControl TabStripPlacement="Top">
<TabItem Header="Liste Jeux">

<DataGrid x:Name="dgListeJeux" VerticalAlignment="Top" HorizontalAlignment="Left" AutoGenerateColumns="False" RowBackground="Khaki" AlternatingRowBackground="Lavender">
<DataGrid.Columns>
<DataGridTextColumn Header="Nom" Width="75" Binding="{Binding Nom}" x:Name="nom"/>
<DataGridTextColumn Header="MinimumJoueurs" Width="120" Binding="{Binding MinimumJoueurs}"/>
<DataGridTextColumn Header=" MaximumJoueurs" Width="120" Binding="{Binding MaximumJoueurs}"/>
<DataGridTextColumn Header=" MinimumAge" Width="90" Binding="{Binding MinimumAge}"/>
<DataGridTextColumn Header=" MaximumAge" Width="90" Binding="{Binding MaximumAge}"/>






</DataGrid.Columns>

<DataGrid.RowDetailsTemplate>
<DataTemplate>

<StackPanel Orientation="Horizontal">
<TextBlock Text="Categorie: " />
<TextBlock Text="{Binding LstCategorie}"/>
</StackPanel>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>

</TabItem>
<TabItem Header="Ajouter Jeux">



<StackPanel>




<Label
HorizontalAlignment="Center" Content="Ajouter un jeu"/>
<Label Content="Nom"/>
<TextBox x:Name="txtNomJeu" Text="" />
<Label Content="Nombre Joueurs Minimal"/>
<TextBox x:Name="txtNombreJoueursMin" Text="" />
<Label Content="Nombre Joueurs Maximal"/>
<TextBox x:Name="txtNombreJoueursMax" Text="" />
<Label Content="Age minimum"/>
<TextBox x:Name="txtAgeMinimum" Text="" />
<Label Content="Age maximum"/>
<TextBox x:Name="txtAgeMaximum" Text="" />
<Label Content="Numero de la categorie"/>
<TextBox x:Name="txtCategorie" Text="" />


</StackPanel>

</TabItem>
<TabItem Header="Supprimer un Jeux">


</TabItem>



</TabControl>





</Grid>
</Window>

10 réponses

Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
19 mars 2021 à 20:33
Bonjour

merci de lire ce petit tuto afin d'utiliser correctement les balises de code.
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Pour le xaml, il faut choisir xml.

Après on pourra commencer à essayer de t'aider
0
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021
19 mars 2021 à 20:36
donc que je repose ma question
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928 > danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021
19 mars 2021 à 20:37
non, tu réponds en remettant le code correctement
0
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021 > Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024
19 mars 2021 à 20:40
<Window x:Class="TP2_JeuxSociete.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TP2_JeuxSociete"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    
    
    <Grid x:Name="gPrincipal">
        <TabControl TabStripPlacement="Top">
            <TabItem Header="Liste Jeux">

                <DataGrid x:Name="dgListeJeux" VerticalAlignment="Top" HorizontalAlignment="Left" AutoGenerateColumns="False" RowBackground="Khaki" AlternatingRowBackground="Lavender">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Nom" Width="75" Binding="{Binding Nom}" x:Name="nom"/>
                        <DataGridTextColumn Header="MinimumJoueurs" Width="120" Binding="{Binding MinimumJoueurs}"/>
                        <DataGridTextColumn Header=" MaximumJoueurs" Width="120" Binding="{Binding MaximumJoueurs}"/>
                        <DataGridTextColumn Header=" MinimumAge" Width="90" Binding="{Binding MinimumAge}"/>
                        <DataGridTextColumn Header=" MaximumAge" Width="90" Binding="{Binding MaximumAge}"/>






                    </DataGrid.Columns>

                    <DataGrid.RowDetailsTemplate>
                        <DataTemplate>

                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="Categorie:   " />
                                <TextBlock Text="{Binding LstCategorie}"/>
                            </StackPanel>
                        </DataTemplate>
                    </DataGrid.RowDetailsTemplate>
                </DataGrid>

            </TabItem>
            <TabItem Header="Ajouter Jeux">



                <StackPanel>




                    <Label 
        HorizontalAlignment="Center" Content="Ajouter un jeu"/>
                    <Label  Content="Nom"/>
                    <TextBox x:Name="txtNomJeu" Text=""  />
                    <Label  Content="Nombre Joueurs Minimal"/>
                    <TextBox  x:Name="txtNombreJoueursMin" Text="" />
                    <Label Content="Nombre Joueurs Maximal"/>
                    <TextBox x:Name="txtNombreJoueursMax" Text="" />
                    <Label Content="Age minimum"/>
                    <TextBox x:Name="txtAgeMinimum" Text="" />
                    <Label Content="Age maximum"/>
                    <TextBox x:Name="txtAgeMaximum" Text="" />
                    <Label Content="Numero de la categorie"/>
                    <TextBox x:Name="txtCategorie" Text="" />


                </StackPanel>

            </TabItem>
            <TabItem Header="Supprimer un Jeux">


            </TabItem>



        </TabControl>





    </Grid>
</Window> 
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928 > danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021
19 mars 2021 à 20:45
c'est mieux non?
0
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021 > Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024
19 mars 2021 à 20:45
oui
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
19 mars 2021 à 20:48
Tu peux montrer le code behind?
0
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021
19 mars 2021 à 20:49
voila
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.Collections.ObjectModel;
using System.ComponentModel;


namespace TP2_JeuxSociete
{
    /// <summary>
    /// Classe qui représente un jeu de société.
    /// Les données initiales proviennent de https://boardgamegeek.com
    /// </summary>
    public class JeuSociete
    {
        public string Nom { get; set; }

        public int MinimumJoueurs { get; set; }

        public int MaximumJoueurs { get; set; }

        public int MinimumAge { get; set; }

        public int MaximumAge { get; set; } // On met un maximum de 99 ans quand il n'y a pas réellement de limite.

        public List<CategorieJeu> LstCategorie { get; set; }
        private const string NOM_FICHIER = "ListeJeuSociete.json";
        public JeuSociete()
        {
            
        }
     
        /// <summary>
        /// Fait la lecture du fichier de données et retourne une liste de jeux.
        /// </summary>
        /// <remarks>
        /// Si le fichier est inexistant, vide ou corrompu, la méthode retourne une liste vide.
        /// </remarks>
        /// <returns>Une liste de jeux.</returns>
        public static List<JeuSociete> ChargerListeJeux()
        {
            string[] lignes = System.IO.File.ReadAllLines(@"ListeJeuSociete.txt");

            List<JeuSociete> lstJeux = new List<JeuSociete>();


            foreach (string ligne in lignes)
            {

                List<CategorieJeu> LstCat = new List<CategorieJeu>();

                string[] champsLigne = ligne.Split(':');

                string NomJ = champsLigne[0];
                int MinimunJoueursJ = Int32.Parse(champsLigne[1]);
                int MaximumJoueursJ = Int32.Parse(champsLigne[2]);
                int MinimumAgeJ = Int32.Parse(champsLigne[3]);
                int MaximumAgeJ = Int32.Parse(champsLigne[4]);

                string[] CategoriesJ = champsLigne[5].Split(',');

                foreach (string categorie in CategoriesJ)
                {
                    LstCat.Add(new CategorieJeu(categorie));
                }

                lstJeux.Add(new JeuSociete(NomJ, MinimunJoueursJ, MaximumJoueursJ, MinimumAgeJ, MaximumAgeJ));
            }
            return lstJeux;
        }

        /// <summary>
        /// Enregistre la liste de jeux reçue dans le fichier de données.
        /// </summary>
        /// <remarks>
        /// Le contenu existant est écrasé à l'écriture.
        /// Si le fichier n'existe pas, il sera créé.
        /// </remarks>
        /// <param name="lst">La liste des jeux qui doit être enregistrée dans le fichier.</param>
        public static void EnregistrerListeJeux(List<JeuSociete> lst)
        {
            using (StreamWriter sw = new StreamWriter("ListeJeuSociete.txt"))
            {
                foreach (JeuSociete element in lst)
                {
                    StringBuilder ligne = new StringBuilder();

                    ligne.Append(element.Nom + ":"
                        + element.MinimumJoueurs + ":"
                        + element.MaximumJoueurs + ":"
                        + element.MinimumAge + ":"
                        + element.MaximumAge + ":");

                    for (int i = 0; i < element.LstCategorie.Count; i++)
                    {
                        if (i < element.LstCategorie.Count - 1)
                            ligne.Append(element.LstCategorie[i].Nom + ",");
                        else
                            ligne.Append(element.LstCategorie[i].Nom);
                    }

                    sw.WriteLine(ligne);
                }
            }
        }

        /// <summary>
        /// Contructeur de la classe JeuSociete
        /// </summary>
        /// <param name="nom">Le nom du jeu.</param>
        /// <param name="minJoueurs">Le nombre minimal de joueurs.</param>
        /// <param name="maxJoueurs">Le nombre maximal de joueurs.</param>
        /// <param name="minAge">Le minimum d'age requis pour jouer.</param>
        /// <param name="maxAge">Le maximum d'age recommandé pour jouer.</param>
        /// <remarks>
        /// La gestion des catégories d'un jeu se fait par les méthodes de la classe.
        /// </remarks>
     /*   public JeuSociete(string nom, int minJoueurs, int maxJoueurs, int minAge, int maxAge, List<CategorieJeu> lstCat)
        {
            Nom = nom;
            MinimumJoueurs = minJoueurs;
            MaximumJoueurs = maxJoueurs;
            MinimumAge = minAge;
            MaximumAge = maxAge;

           // LstCategorie = lstCat;

            
            
        }*/

        public JeuSociete(string nom, int minJoueurs, int maxJoueurs, int minAge, int maxAge)
        {
            Nom = nom;
            MinimumJoueurs = minJoueurs;
            MaximumJoueurs = maxJoueurs;
            MinimumAge = minAge;
            MaximumAge = maxAge;

            LstCategorie = new List<CategorieJeu>();
        }

        /// <summary>
        /// Permet d'ajouter une catégorie au jeu (si cette catégorie est valide).
        /// </summary>
        /// <param name="nouvelleCategorie">La nouvelle catégorie.</param>
        public void AjouterCategorie(CategorieJeu nouvelleCategorie)
        {
            if (CategorieJeu.EstValide(nouvelleCategorie.Nom))
            {
                LstCategorie.Add(nouvelleCategorie);
            }
        }

        /// <summary>
        /// Permet de retirer une catégorie d'un jeu. 
        /// </summary>
        /// <param name="ancienneCategorie"></param>
        public void RetirerCategorie(CategorieJeu ancienneCategorie)
        {
            LstCategorie.Remove(ancienneCategorie);
        }

        /// <summary>
        /// Permet de vérifier si le jeu est d'une catégorie précise.
        /// </summary>
        /// <param name="categorie">La catégorie à vérifier.</param>
        /// <returns>True si le jeu est de la catégorie à vérifier, false sinon.</returns>
        public bool EstDeCategorie(CategorieJeu categorie)
        {
            return LstCategorie.Contains(categorie);
        }
        public static void ChargerFichier()
        {
            StreamReader fichierEtudiants; // using System.IO; 
            string json;
            fichierEtudiants = new StreamReader(File.OpenRead(NOM_FICHIER));
            json = fichierEtudiants.ReadLine();
            fichierEtudiants.Close();
          


            MainWindow.jeu = JsonConvert.DeserializeObject<ObservableCollection<JeuSociete>>(json);
          
            



        }
    }
}
0
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021
19 mars 2021 à 20:51
le main window est là

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;

namespace TP2_JeuxSociete
{
    /// <summary>
    /// Logique d'interaction pour MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public static ObservableCollection<JeuSociete> jeu = new ObservableCollection<JeuSociete>();
        public UserControl ContenuEcran { get; set; }

        public UCJeuSociete Jeu = new UCJeuSociete();
        public UCFormulaire formulaire = new UCFormulaire();
        public MainWindow()
        {
            InitializeComponent();
            JeuSociete.ChargerFichier();

            dgListeJeux.ItemsSource = jeu;

        }
    }
}
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
19 mars 2021 à 20:51
Ok, celui de mainwindows aussi
0
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021
19 mars 2021 à 20:52
je viens de l'envoyer
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
Modifié le 19 mars 2021 à 21:06
Ok,

alors, dans MainWindows jeu n'est pas une propriété, c'est un champ.
Le binding fonctionne avec des propriétés.

En plus, c'est un champ static, et il est préférable d'utiliser une propriété d'instance.

Dans la classe JeuDeSociete, il faudrait modifier un peu ChargerFichier

        public static ObservableCollection<JeuSociete> ChargerFichier()//la méthode est du type de la collection
        {
            StreamReader fichierEtudiants; // using System.IO; 
            string json;
            fichierEtudiants = new StreamReader(File.OpenRead(NOM_FICHIER));
            json = fichierEtudiants.ReadLine();
            fichierEtudiants.Close();
          


            return JsonConvert.DeserializeObject<ObservableCollection<JeuSociete>>(json);//ici elle retourne la liste
        }


E un peu le code behind de Mainwindow

    public partial class MainWindow : Window
    {
        public ObservableCollection<JeuSociete> jeu {get; set} //jeu est une propriété
        public UserControl ContenuEcran { get; set; }

        public UCJeuSociete Jeu = new UCJeuSociete();
        public UCFormulaire formulaire = new UCFormulaire();
        public MainWindow()
        {
            InitializeComponent();
            jeu = JeuSociete.ChargerFichier();//on affecte jeu

            dgListeJeux.ItemsSource = jeu;

        }
    }


Par contre juste avec ça, je ne voies pas comment le binding peut marcher pour le 2eme tabitem.
Je pense qu'il serait mieux, de binder la fenêtre entière sur elle-même et coder le xaml pour "répartir" le binding.

    public partial class MainWindow : Window
    {
        public ObservableCollection<JeuSociete> jeu {get; set}
        public UserControl ContenuEcran { get; set; }

        public UCJeuSociete Jeu = new UCJeuSociete();
        public UCFormulaire formulaire = new UCFormulaire();
        public MainWindow()
        {
            InitializeComponent();
            jeu = JeuSociete.ChargerFichier();//on affecte jeu

            this.DataContext = this; //là
        }
    }


        Title="MainWindow" Height="450" Width="800" DataContext="{Binding}"> <--On indique ici que tout le contexte de la fenêtre sera bindé-->
    
    
    <Grid x:Name="gPrincipal" DataContext="{Binding .}"><--le point signale que le grid a le même contexte que son parent-->
        <TabControl TabStripPlacement="Top" DataContext="{Binding .}">
            <TabItem Header="Liste Jeux" DataContext="{Binding .}">

                <DataGrid x:Name="dgListeJeux" VerticalAlignment="Top" HorizontalAlignment="Left" AutoGenerateColumns="False" RowBackground="Khaki" AlternatingRowBackground="Lavender" ItemsSource = "{Binding jeu}"> <-- et là, on spécifie le contexte du datagrid-->



PS j'ai tapé directement dans le fil, il n'est pas impossible que j'ai laissé trainé une coquille par ci par là
0
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021
19 mars 2021 à 21:28
merci j'ai modifié mais a la place de collection j'aimerai qu'il affiche la valeur de la liste dans car pour les autres valeurs ça marche
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
19 mars 2021 à 21:39
As tu mis un point d'arrêt juste après la désérialisation du json pour voir si cette valeur est correcte?
Car là, à brule pourpoint, je ne voie pas ce qui cloche
0
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021
19 mars 2021 à 21:47
okay je vais t'expliquer j'ai un fichier json qui contient les données et les valeurs que tu vois dans la datagrid sont celles qui sont dans mon fichier.json et il me reste à afficher la liste des catégorie d'un même jeu dans mon datagrid et au lieu d'afficher cette liste il affiche (collection ) je t'envoie une capture d'écran de mon fichier c'est juste une partie avec les champs
0
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021
19 mars 2021 à 21:49
il n'affiche pas les valeurs de LstCategorie
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
20 mars 2021 à 00:23
Ha oui.

Tu peux écrire une colonne contenant une listbox pour cette liste

                <DataGrid x:Name="dgListeJeux" VerticalAlignment="Top" HorizontalAlignment="Left" AutoGenerateColumns="False" RowBackground="Khaki" AlternatingRowBackground="Lavender">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Nom" Width="75" Binding="{Binding Nom}" x:Name="nom"/>
                        <DataGridTextColumn Header="MinimumJoueurs" Width="120" Binding="{Binding MinimumJoueurs}"/>
                        <DataGridTextColumn Header=" MaximumJoueurs" Width="120" Binding="{Binding MaximumJoueurs}"/>
                        <DataGridTextColumn Header=" MinimumAge" Width="90" Binding="{Binding MinimumAge}"/>
                        <DataGridTextColumn Header=" MaximumAge" Width="90" Binding="{Binding MaximumAge}"/>
                        <--ici là-->
                <DataGridTemplateColumn Header="Catégories">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ListBox ItemsSource="{Binding LstCategorie}"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                    </DataGrid.Columns>

0
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021
20 mars 2021 à 04:10
j'ai ajouté la listBox sauf que regarde ce que ça donne comme résultat il n'affiche pas bien le contenu comme il faut
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
20 mars 2021 à 08:18
Il est vrai que j'ai essayé avec une liste de string.

En supposant que ta classe CategorieJeu dispose d'une propriété qui s'appelle Nom

<ListBox ItemsSource="{Binding LstCategorie}" DisplayMemberPath="Nom"/>

0
danny243 Messages postés 74 Date d'inscription vendredi 19 mars 2021 Statut Membre Dernière intervention 16 octobre 2021
20 mars 2021 à 13:02
merci beaucoup ça marche
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 928
20 mars 2021 à 13:06
De rien
0