在上一章中,我们了解到让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属性关闭自动生成列的功能,你可以完全控制哪些列可以显示出来,以及这些列的数据是如何显示和编辑。通过这篇文章的例子你可以看到,自定义列的功能提供了许多很有意思的可能性,你可以通过完全自定义的列编辑器来提高用户体验。