如何将List <CustomObject>绑定到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; } } }
这是我的网格如何:
<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>
我已经习惯了ASP.Net的数据绑定,我可以轻松地说:
this.dataGrid1.DataSource = list;
我怎样才能在WPF中继续?
如果你不希望你的list
被重新创build,那么你可以使用与你使用Asp.Net相同的方法(而不是DataSource
,WPF中的这个属性通常被命名为ItemsSource
):
this.dataGrid1.ItemsSource = list;
但是,如果你想用新的集合实例replace你的list
,那么你应该考虑使用databinding
。
您应该在xaml代码中执行此操作:
<DataGrid ItemsSource="{Binding list}" [...]> [...] </DataGrid>
我build议你使用ObservableCollection
作为你的后备集合,因为它会传播对数据网格的改变,因为它实现了INotifyCollectionChanged
。
实际上,要正确地支持sorting,过滤等,应该使用CollectionViewSource作为DataGrid和列表之间的链接,如下所示:
<Window.Resources> <CollectionViewSource x:Key="ItemCollectionViewSource" CollectionViewType="ListCollectionView"/> </Window.Resources>
DataGrid行看起来像这样:
<DataGrid DataContext="{StaticResource ItemCollectionViewSource}" ItemsSource="{Binding}" AutoGenerateColumns="False">
在后面的代码中,将CollectionViewSource与链接链接起来。
CollectionViewSource itemCollectionViewSource; itemCollectionViewSource = (CollectionViewSource)(FindResource("ItemCollectionViewSource")); itemCollectionViewSource.Source = itemList;
有关详细示例,请参阅CoedProject上的文章: http : //www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings
您不需要在xaml中手动input列名称。 只需将AutoGenerateColumns属性设置为true,您的列表就会自动绑定到DataGrid。 参考代码。 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(); }