DataGrid是WPF中的数据显示控件,相当于Winform中的DataGridView。但是两者之间的用法确存在一些差异。在文档中,如果利用两者的不同之处可以更加清楚的描述好DataGrid的使用,我将采用该种方法。好了我们首先看一下如何为DataGrid指定数据源吧!

   我们知道在Winform中DataGridView的数据源可以是DataTable,DataView,List<T>等,但是在WPF中DataGrid的数据源不能直接为DataTable。作为DataGrid的数据源的对象必须实现了IEnumerable接口的,至于你们是否怀疑DataGrid的数据源真的不能直接指定为DataTable?那最好是自己去尝试一下。因为求知就得如此。我是试过了哈!如果你真的要将DataTable指定给DataGrid。那么你可以采用以下方法:this.dataGrid.ItemSource = dt.DefaultView;这里的dt是你创建的DataTable对象。你注意到了吗?先前我们使用的诸如DataGridView,ComboBox,Web中的GridView等数据显示控件在指定数据源时都是为其属性DataSource指定数据源对象。但是WPF中的DataGrid却不是这样,我开始接触的时候按照自己的思维方式去找寻DataSource属性,可未成功!查阅资料才知道是ItemSource属性。所以请注意了!

  我们在使用DataGrid控件时,可以直接将数据源对象指定给DataGrid的ItemSource属性。此时数据显示将按照数据源的数据结构进行数据显示。如果你需要根据你自己定义的方式显示数据,此时需要借助于代码定义样式了!DataGrid的整体外观我们可以通过设置DataGrid的属性来体现,也可以通过Style来体现。如利用DataGrid的HeadersVisibility设置头或列是否显示,该属性有三个值,分别的含义是:None 表示列头和行头都不显示; All 表示列头和行头都显示; Row表示行头显示; Column 表示列头显示;利用DataGrid的RowBackgroud属性设置行的背景色等等。我们也可以利用设置DataGrid的Style来控制DataGrid的外观样式。如利用DataGrid.ColumnHeaderStyle来设置DataGrid的列头显示样式,示例代码如下:

<DataGrid.ColumnHeaderStyle>
                 <Style TargetType="DataGridColumnHeader">
                     <Setter Property="Background">
                         <Setter.Value>
                             <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                 <GradientStop Color="White" Offset="0"/>
                                 <GradientStop Color="Yellow" Offset="0.5"/>
                                 <GradientStop Color="White" Offset="1"/>
                             </LinearGradientBrush>
                         </Setter.Value>
                     </Setter>
                     <Setter Property="Foreground" Value="Black"/>
                     <Setter Property="FontSize" Value="13" />
                 </Style>
             </DataGrid.ColumnHeaderStyle>

以上代码分别对DataGrid的列头的背景色、前景色和字体做了设置。其中在设置背景色时,利用了(LinearGradientBrush)使其背景色呈渐变效果。

利用DataGrid.RowHeaderStyle来设置DataGrid的行头显示样式,示例代码如下:

<DataGrid.RowHeaderStyle>
                 <Style TargetType="DataGridRowHeader">
                     <Setter Property="Content" Value=" •¤"/>
                     <Setter Property="Width" Value="10"/>
                     <Setter Property="Background">
                         <Setter.Value>
                             <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
                                 <GradientStop Color="White" Offset="0"/>
                                 <GradientStop Color="SkyBlue" Offset="1"/>
                             </LinearGradientBrush>
                         </Setter.Value>
                     </Setter>
                     <Style.Triggers>
                         <Trigger Property="IsMouseOver" Value="True">
                             <Setter Property="ToolTip" Value="选中该行"/>
                         </Trigger>
                     </Style.Triggers>
                 </Style>
             </DataGrid.RowHeaderStyle>

看着这些代码,与刚刚的ColumnHeaderStyle的代码大同小异,在此我想说的是其中的Style.Trigger节点,该节点顾名思义可以理解为触发器。在以上代码中表示当鼠标移动到行头上方时,将提示"选中该行"

在对于列头的样式定义中,以上方法是对所有列进行的全局定义。如果你需要将特殊位置的列显示为特殊样式,那么你可以对该列进行单独的样式定义,方法如下:

<DataGridTextColumn Header="编号" Binding="{Binding Path=ID}">
                     <DataGridColumn.HeaderStyle>
                         <Style TargetType="DataGridColumnHeader">
                             <Setter Property="Background">
                                 <Setter.Value>
                                     <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                                         <GradientStop Color="White" Offset="0"/>
                                         <GradientStop Color="SkyBlue" Offset="0.5"/>
                                         <GradientStop Color="White" Offset="1"/>
                                     </LinearGradientBrush>
                                 </Setter.Value>
                             </Setter>
                             <Setter Property="Foreground" Value="Black"/>
                             <Setter Property="FontSize" Value="13"/>
                             <Setter Property="Width" Value="100"/>
                             <Style.Triggers>
                                 <Trigger Property="IsMouseOver" Value="True">
                                     <Setter Property="ToolTip" Value="按照该列进行排序"/>
                                 </Trigger>
                             </Style.Triggers>
                         </Style>
                     </DataGridColumn.HeaderStyle>
                 </DataGridTextColumn>

在该段代码中,DataGridTextColumn代表该列以文本的形式显示,同时显示的数据为您所指定数据源的ID这个字段的数据。在这里我们提到了DataGridTextColumn使其内容按照文本的形式显示,在WPF中提供了四种基本的列显示样式:

DataGridTextColumn                     文本显示内容,指定的数据类型为String
              DataGridCheckBoxColumn          复选框的形式显示内容,指定的数据类型为Boolean
              DataGridComboBoxColumn       下拉列表的形式显示内容,指定的数据类型为Enum
              DataGridHyperlinkColumn           超链接的形式显示内容,指定的数据类型为Uri

往往我们在实际的开发中,以上四种样式并不能完全满足我们的需求,此时我们可以利用DataGridTemplateColumn来自定义显示样式,示例如下:

在使用DataGridTemplateColumn时,我们必须先定义DataTemplate:

<Window.Resource>
    <DataTemplate x:Key="BirthTemplate">
             <StackPanel Width="200" Height="20">
                 <Border Background="Orange" BorderBrush="Black" BorderThickness="1">
                     <TextBlock Text="{Binding Birthday, StringFormat={}{0:MM-dd}}" 
                        FontSize="13" HorizontalAlignment="Center"/>
                 </Border>
                 <Border Background="White" BorderBrush="Black" BorderThickness="1">
                     <TextBlock Text="{Binding Birthday, StringFormat={}{0:yyyy}}" 
                        FontSize="13" HorizontalAlignment="Center"/>
                 </Border>
             </StackPanel>
         </DataTemplate>
         <DataTemplate x:Key="EditingDateTemplate">
             <DatePicker SelectedDate="{Binding Birthday}"/>
         </DataTemplate></Window.Resource>
使用以上样式:
          <DataGridTemplateColumn Header="出生日期" Width="100"
                         CellTemplate="{StaticResource BirthTemplate}"
                         CellEditingTemplate="{StaticResource EditingDateTemplate}"/>