-
DataGrid 控件:

DataGrid列

在上一章中,我们了解到让WPF DataGrid启动并运行是多么容易的一件事。 其中一个原因是DataGrid会根据您使用的数据源自动为您生成适当的列。

但是,在某些情况下,您可能需要手动要定义显示的列,因为您不需要数据源的所有属性/列,或者因为您想控制使用哪种内联编辑器。

用户自定义列

让我们来尝试一个例子,它看起来和前一章的例子很像,但是我们将手动定义所有列以获得最大的控制。 您可以根据您希望显示/编辑的数据选择列类型。 截至撰写时,以下列类型可用:

尤其是最有一个,DataGridTemplateColumn列,非常有意思。它允许你定义任意类型的内容,提供了了在列内部使用自定义控件的条件,不管这个控件是来自WPF库还是第三方控件,下面是一个例子:

<Window x:Class="WpfTutorialSamples.DataGrid_control.DataGridColumnsSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DataGridColumnsSample" Height="200" Width="300">
    <Grid Margin="10">
		<DataGrid Name="dgUsers" AutoGenerateColumns="False">
			<DataGrid.Columns>

				<DataGridTextColumn Header="Name" Binding="{Binding Name}" />

				<DataGridTemplateColumn Header="Birthday">
					<DataGridTemplateColumn.CellTemplate>
						<DataTemplate>
							<DatePicker SelectedDate="{Binding Birthday}" BorderThickness="0" />
						</DataTemplate>
					</DataGridTemplateColumn.CellTemplate>
				</DataGridTemplateColumn>

			</DataGrid.Columns>
		</DataGrid>
	</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Windows;

namespace WpfTutorialSamples.DataGrid_control
{
	public partial class DataGridColumnsSample : Window
	{
		public DataGridColumnsSample()
		{
			InitializeComponent();

			List<User> users = new List<User>();
			users.Add(new User() { Id = 1, Name = "John Doe", Birthday = new DateTime(1971, 7, 23) });
			users.Add(new User() { Id = 2, Name = "Jane Doe", Birthday = new DateTime(1974, 1, 17) });
			users.Add(new User() { Id = 3, Name = "Sammy Doe", Birthday = new DateTime(1991, 9, 2) });

			dgUsers.ItemsSource = users;
		}
	}

	public class User
	{
		public int Id { get; set; }

		public string Name { get; set; }

		public DateTime Birthday { get; set; }
	}
}

在标记里,为了能够控制我们要使用的列,我给表格增加一个AutoGenerateColumns属性,并设置为false。你可以看到,我并没有处理ID列,因为我决定在这个例子里不去关心它。对于Name属性,我用一个简单的文本列,所以,这个例子里最有意思的部分就是这个Birthday列,我使用了内部是DataPicker控件的DataGridTemplateColumn列。这样可以允许用户从日历里面选择一天,而不是手动把日期敲进去,就像你在截图中看到的那样。

总结

通过AutoGenerateColumns属性关闭自动生成列的功能,你可以完全控制哪些列可以显示出来,以及这些列的数据是如何显示和编辑。通过这篇文章的例子你可以看到,自定义列的功能提供了许多很有意思的可能性,你可以通过完全自定义的列编辑器来提高用户体验。