Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C#] WPF Datagrid Binding

Sujet résolu
    19 juin 2010 à 19:10:38

    Bonjour,

    j'découvre un peu WPF et j'dois avouer que j'ai pas mal de problème avec le concept de "binding".

    J'ai voulu lier un ObservableCollection à un datagrid mais ca ne fonctionne pas.

    Voici mon code xaml :
    <Window x:Class="DatagridTest.MainWindow" Name="This"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="Some Game Data" Height="600" Width="436">
        <StackPanel>
            <DataGrid HorizontalAlignment="Left" Margin="10,10,0,0" Height="400" Width="400" ItemsSource="{Binding test}">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Game Name" Binding="{Binding GameName}" />
                    <DataGridTextColumn Header="Creator" Binding="{Binding Creator}" />
                    <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}" />
                </DataGrid.Columns>
            </DataGrid>
        </StackPanel>
    </Window>
    


    Mon code C# :
    public partial class MainWindow : Window
    {
    	ObservableCollection<GameData> test = new ObservableCollection<GameData>();
    
    	public MainWindow()
    	{
    		test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
    		test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
    		test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
    		test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
    		InitializeComponent();
    	}
    }
    public class GameData
    {
    	private string _gamename;
    	private string _creator;
    	private string _publisher;
    
    	public GameData(string gn, string cr, string pu)
    	{
    		_gamename = gn;
    		_creator = cr;
    		_publisher = pu;
    	}
    	public string GameName {
    		get { return _gamename; }
    		set { _gamename = value; } 
    	}
    	public string Creator {
    		get { return _creator; }
    		set { _creator = value; } 
    	}
    	public string Publisher {
    		get { return _publisher; }
    		set { _publisher = value; } 
    	}
    }
    


    La Datagrid s'affiche bien ainsi que les headers, mais le contenu ne s'affiche pas.

    Si quelqu'un voit d'ou ca vient,
    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      19 juin 2010 à 19:54:23

      Tu as de la chance, le binding est un point sur lequel je commence à gérer ^^

      Il te manque à définir un DataContext, car ici tu bindes ton itemSource sur une propriété test, mais tu ne sais pas d'où prendre cette propriété. Je te propose donc de faire dans ton constructeur de MainWindow:
      this.dataContext = this;
      • Partager sur Facebook
      • Partager sur Twitter
        19 juin 2010 à 20:05:45

        Ca ne m'affiche toujours rien dans la datagrid :(

        Avec ce que tu as dis :
        public MainWindow()
        {
           this.DataContext = this;
           test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
           test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
           test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
           test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
           InitializeComponent();
        }
        

        C'était bien comme cela ?
        • Partager sur Facebook
        • Partager sur Twitter
          19 juin 2010 à 20:08:30

          Non, test n'étant pas une propriété, ça ne marche pas.
          Ou tu fais de test une propriété
          Ou tu fais "this.dataContext = test;", et tu changes ton binding en "{Binding .}"
          • Partager sur Facebook
          • Partager sur Twitter
            19 juin 2010 à 20:17:34

            Il te manquait get; et set; devant ton ObservableCollection

            Chez moi le code suivant marche impec:

            <Window x:Class="WPFTest.Window1"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    x:Name="MainWindow"
                    Title="MainWindow" Height="350" Width="525">
                <StackPanel>
                    <DataGrid ItemsSource="{Binding test}">
            
                    </DataGrid>
                </StackPanel>
            </Window>
            


            *public partial class Window1 : Window
            {
                public ObservableCollection<GameData> test { get; set; }
            
                public Window1()
                {
                    InitializeComponent();
                    this.DataContext = this;
                    test = new ObservableCollection<GameData>();
                    test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
                    test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
                    test.Add(new GameData("World Of Warcraft", "Blizzard", "Blizzard"));
                }
            }
            
            • Partager sur Facebook
            • Partager sur Twitter
              19 juin 2010 à 20:32:03

              En effet, ca fonctionne bien, merci.

              Par contre, il me crée les headers lui même avec cette méthode.
              Il y a pas moyen pour qu'il ajoute juste les valeurs là ou j'ai mis {Binding Attribut} ?
              Vu que si je souhaite mettre des espaces dans mon nom de header, je suis un peu gêné avec cette méthode.
              • Partager sur Facebook
              • Partager sur Twitter
                19 juin 2010 à 21:13:51

                En mettant "AutoGenerateColumns" à false:

                <DataGrid ItemsSource="{Binding test}" AutoGenerateColumns="False">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Game Name" Binding="{Binding GameName}"/>
                        <DataGridTextColumn Header="Creator" Binding="{Binding Creator}"/>
                        <DataGridTextColumn Header="Publisher" Binding="{Binding Publisher}"/>
                    </DataGrid.Columns>
                </DataGrid>
                
                • Partager sur Facebook
                • Partager sur Twitter
                  19 juin 2010 à 21:14:56

                  Niquel !
                  Merci bien à vous deux ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 juin 2010 à 21:17:14

                    No problèm!! hésite pas à redemander si ta d'autres questions
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 avril 2018 à 16:44:59

                      Salut

                      Si jamais j'ai besoin d'afficher des élément de 2 table différenteS dans le datagrid, vous faite comment?

                      J'ai essayé de faire une requête et de joindre les éléments de 2 collections Observable mais du coup, ma nouvelle collection observable doit être de quel type?

                      par exemple dans ma collection activity j'ai l'id du responsable, mais son nom est dans la collection User.

                      J'ai essayé de mettre ca dans la collection activity mais ca fais une erreur.

                      public ObservableCollection<User> users { get; set; }
                      public ObservableCollection<Activity> activitys { get; set; }



                      • Partager sur Facebook
                      • Partager sur Twitter

                      [C#] WPF Datagrid Binding

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown