web-dev-qa-db-fra.com

Comment lier un List <CustomObject> à un WPF DataGrid?

Je suis nouveau sur WPF et je souhaite effectuer des liaisons de données de base. J'ai une liste d'un CustomObject et je veux le lier à un DataGrid.

MainWindow.xaml.cs

   using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    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;

    namespace WpfApplication1
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                List<ArticleItem> list = new List<ArticleItem>() 
                {
                new ArticleItem(){ ID=3, Title="test", ViewCount=5},
                new ArticleItem(){ ID=3, Title="test", ViewCount=5},
                new ArticleItem(){ ID=3, Title="test", ViewCount=5},
                new ArticleItem(){ ID=3, Title="test", ViewCount=5},
                };
            }
        }

        public class ArticleItem 
        {
            public int ID { get; set; }
            public int ViewCount { get; set; }
            public String Title { get; set; }
        }
    }

Voici à quoi ressemble ma grille:

<DataGrid Height="179" HorizontalAlignment="Left" Margin="54,65,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="382">
    <DataGrid.Columns>
        <DataGridTextColumn Header="ID"/>
            <DataGridTextColumn Header="ViewCount" />
        <DataGridTextColumn Header="Title" />
    </DataGrid.Columns>
</DataGrid>

Je suis habitué à la liaison de données d'ASP.Net, où je peux facilement dire:

this.dataGrid1.DataSource = list;

Comment dois-je procéder dans WPF?

44
citronas

si vous ne vous attendez pas à ce que votre list soit recréé, vous pouvez utiliser la même approche que vous avez utilisée pour Asp.Net (au lieu de DataSource cette propriété dans WPF est généralement nommée ItemsSource):

this.dataGrid1.ItemsSource = list;

Mais si vous souhaitez remplacer votre list par une nouvelle instance de collection, vous devriez envisager d'utiliser databinding.

30
Snowbear

Vous devez le faire dans le code xaml:

<DataGrid ItemsSource="{Binding list}" [...]>
  [...]
</DataGrid>

Je vous conseille d'utiliser un ObservableCollection comme votre collection de support, car cela propagerait les changements dans la grille de données, car il implémente INotifyCollectionChanged.

20
Femaref

En fait, pour prendre correctement en charge le tri, le filtrage, etc., une CollectionViewSource doit être utilisée comme lien entre le DataGrid et la liste, comme ceci:

<Window.Resources>
  <CollectionViewSource x:Key="ItemCollectionViewSource" CollectionViewType="ListCollectionView"/>
</Window.Resources>   

La ligne DataGrid ressemble à ceci:

<DataGrid
  DataContext="{StaticResource ItemCollectionViewSource}"
  ItemsSource="{Binding}"
  AutoGenerateColumns="False">  

Dans le code derrière, vous liez CollectionViewSource avec votre lien.

CollectionViewSource itemCollectionViewSource;
itemCollectionViewSource = (CollectionViewSource)(FindResource("ItemCollectionViewSource"));
itemCollectionViewSource.Source = itemList;

Pour un exemple détaillé, voir mon article sur CoedProject: http://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings

12
Peter Huber

Vous n'avez pas besoin de donner manuellement les noms des colonnes dans xaml. Définissez simplement la propriété AutoGenerateColumns sur true et votre liste sera automatiquement liée à DataGrid. référez-vous au code. Code XAML:

<Grid>
    <DataGrid x:Name="MyDatagrid" AutoGenerateColumns="True" Height="447" HorizontalAlignment="Left" Margin="20,85,0,0" VerticalAlignment="Top" Width="799"  ItemsSource="{Binding Path=ListTest, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  CanUserAddRows="False"> </Grid>

C #

Public Class Test 
{
    public string m_field1_Test{get;set;}
    public string m_field2_Test { get; set; }
    public Test()
    {
        m_field1_Test = "field1";
        m_field2_Test = "field2";
    }
    public MainWindow()
    {

        listTest = new List<Test>();

        for (int i = 0; i < 10; i++)
        {
            obj = new Test();
            listTest.Add(obj);

        }

        this.MyDatagrid.ItemsSource = ListTest;

        InitializeComponent();

    }
3
Neha