如何将List <CustomObject>绑定到WPF DataGrid?

cit*_*nas 44 c# data-binding wpf datagrid

我是WPF的新手,想要做一些基本的数据绑定.我有一个CustomObject的列表,并希望将其绑定到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; }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这就是我的网格的样子:

<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>
Run Code Online (Sandbox Code Playgroud)

我已经习惯了ASP.Net的数据绑定,我可以很容易地说:

this.dataGrid1.DataSource = list;
Run Code Online (Sandbox Code Playgroud)

我该如何进行WPF?

Sno*_*ear 30

如果您不希望list重新创建,那么您可以使用与Asp.Net相同的方法(而不是DataSourceWPF中的此属性通常被命名ItemsSource):

this.dataGrid1.ItemsSource = list;
Run Code Online (Sandbox Code Playgroud)

但是,如果您想要更换list新的集合实例,那么您应该考虑使用databinding.


Fem*_*ref 20

你应该在xaml代码中做到这一点:

<DataGrid ItemsSource="{Binding list}" [...]>
  [...]
</DataGrid>
Run Code Online (Sandbox Code Playgroud)

我建议你使用一个ObservableCollection作为你的支持集合,因为它会将更改传播到datagrid,因为它实现了INotifyCollectionChanged.

  • 它需要是数据绑定的属性。另外,查看输出窗口,通常会有一些信息可以帮助您找出问题。 (2认同)
  • 这是一个更好的答案,接受的答案将功能与数据网格无法很好地同步。您需要在发生更改时手动调用 `dataGrid.Items.Refersh()`,并且该调用不会通过单击列进行过滤。使用 `ObservableCollection` 可以解决所有这些问题。 (2认同)

Pet*_*ber 12

实际上,为了正确支持排序,过滤等,CollectionViewSource应该用作DataGrid和列表之间的链接,如下所示:

<Window.Resources>
  <CollectionViewSource x:Key="ItemCollectionViewSource" CollectionViewType="ListCollectionView"/>
</Window.Resources>   
Run Code Online (Sandbox Code Playgroud)

DataGrid行如下所示:

<DataGrid
  DataContext="{StaticResource ItemCollectionViewSource}"
  ItemsSource="{Binding}"
  AutoGenerateColumns="False">  
Run Code Online (Sandbox Code Playgroud)

在后面的代码中,您将CollectionViewSource与您的链接相关联.

CollectionViewSource itemCollectionViewSource;
itemCollectionViewSource = (CollectionViewSource)(FindResource("ItemCollectionViewSource"));
itemCollectionViewSource.Source = itemList;
Run Code Online (Sandbox Code Playgroud)

有关详细示例,请参阅我在CoedProject上的文章:http: //www.codeproject.com/Articles/683429/Guide-to-WPFvalsGrid-formatting-using-bindings