1、DataGrid 介绍
DataGrid 表示用于在可自定义的网格中显示数据的控件。
**************************************************************************************************************
2、常用属性介绍,更多属性详见 MSDN DataGrid
ActualHeight/ActualWidth:元素呈现的高度/宽度。
CanSelectMultipleItems:获取或设置一个值,该值指示是否可以一次选择 MultiSelector 中的多个项。
CanUserAddRows:获取或设置一个值,该值指示用户是否可在 DataGrid 中添加新行。
CanUserDeleteRows:获取或设置一个值,该值指示用户是否可从 DataGrid 中删除行。
CanUserReorderColumns:获取或设置一个值,该值指示用户能否通过用鼠标拖动列标题来更改列的显示顺序。
CanUserResizeColumns/CanUserResizeRows:获取或设置一个值,该值指示用户是否可使用鼠标调整列宽/高度。
CanUserSortColumns:获取或设置一个值,该值指示用户能否通过单击列标题对列进行排序。
ColumnHeaderHeight:获取或设置列标题行的高度。
Columns:获取一个集合,该集合包含 DataGrid 中的所有列。
ColumnWidth:获取或设置 DataGrid 中列和标题的标准宽度和大小调整模式。
CurrentCell:获取或设置具有焦点的单元格。CurrentColumn:获取或设置包含当前单元格的列。
CurrentItem:获取与包含当前单元格的行绑定的数据项。
DisplayMemberPath:获取或设置源对象上的值的路径,以用作对象的可视表示形式。
HeadersVisibility:获取或设置用于指定行和列标题可见性的值。
HorizontalGridLinesBrush:获取或设置用于绘制水平网格线的画笔。
HorizontalScrollBarVisibility/VerticalScrollBarVisibility:水平/垂直滚动条可见性。
RowBackground:获取或设置行背景的默认画笔。RowHeaderWidth:获取或设置行标题列的宽度。
RowHeight:获取或设置所有行的建议高度。SelectedCells:获取当前选定单元格的列表。
SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。
SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。
SelectedItems:获取在 MultiSelector 中选定的项。
SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。
SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。
SelectionMode:获取或设置一个值,该值指示如何在 DataGrid 中选择行和单元格。
SelectionUnit:获取或设置一个值,该值指示是否可以在 DataGrid 中选择行、单元格或两者。
Items:获取用于生成 ItemsControl 的内容的集合。ItemTemplate:获取或设置用来显示每个项的 DataTemplate。
ItemsPanel:获取或设置模板,该模板定义对项的布局进行控制的面板。
ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。
SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。
**************************************************************************************************************
3、具体示例代码
DataGrid 样式资源
<Window.Resources>
<!-- 列头标题栏样式 -->
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Background" Value="#555a64"/>
<Setter Property="Foreground" Value="#dddddd"/>
<Setter Property="BorderThickness" Value="1" />
<Setter Property="BorderBrush" Value="Gray" />
<Setter Property="Height" Value="30"/>
<Setter Property="FontSize" Value="14"/>
</Style>
<!-- 单元格样式 -->
<Style TargetType="DataGridCell">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="Gray" />
<Setter Property="FontSize" Value="12"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}" >
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="TextBlock" x:Key="centerAlignmentStyle">
<Setter Property="Foreground" Value="Black"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
<!--背景色改变必须先设置cellStyle 因为cellStyle会覆盖rowStyle样式,换行换色-->
<Style TargetType="DataGridRow">
<Setter Property="Height" Value="30"/>
<Style.Triggers>
<Trigger Property="AlternationIndex" Value="0">
<Setter Property="Background" Value="#e7e7e7" /><!--ffe14d-->
</Trigger>
<Trigger Property="AlternationIndex" Value="1">
<Setter Property="Background" Value="#f2f2f2" /><!--f1ef9f-->
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#f1ef9f" />
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#05c4ff"/>
</Trigger>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Background" Value="#05c4ff"/>
</Trigger>
</Style.Triggers>
</Style>
<!--但由于DataGridTextColumn不能从FrameworkElement或FrameworkContentElement继承而无法使用-->
<!--<Style TargetType="DataGridTextColumn">
<Setter Property="ElementStyle">
<Setter.Value>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</Setter.Value>
</Setter>
</Style>-->
<!--网格线颜色-->
<Style TargetType="DataGrid">
<!--该属性指示是否允许用户调整列宽度-->
<Setter Property="CanUserResizeColumns" Value="false" />
<Setter Property="Background" Value="#2d323c" />
<Setter Property="BorderBrush" Value="Gray" />
<Setter Property="SelectionUnit" Value="FullRow" />
<Setter Property="VerticalScrollBarVisibility" Value="Auto" />
<Setter Property="HorizontalScrollBarVisibility" Value="Auto" />
<Setter Property="RowHeaderWidth" Value="0" />
<Setter Property="HorizontalGridLinesBrush">
<Setter.Value>
<SolidColorBrush Color="#d6c79b" />
</Setter.Value>
</Setter>
<Setter Property="VerticalGridLinesBrush">
<Setter.Value>
<SolidColorBrush Color="#d6c79b" />
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
后台定义绑定数据
public partial class MainWindow : Window, System.ComponentModel.INotifyPropertyChanged
{
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
InitalData();
}
}
public partial class MainWindow
{
private void InitalData()
{
NationalityInfo.Add(new Nationality() { Name = "中国", Value = "Chian" });
NationalityInfo.Add(new Nationality() { Name = "俄罗斯", Value = "Russia" });
NationalityInfo.Add(new Nationality() { Name = "朝鲜", Value = "North Korea" });
NationalityInfo.Add(new Nationality() { Name = "巴基斯坦", Value = "Pakistan" });
NationalityInfo.Add(new Nationality() { Name = "阿富汗", Value = "Afghanistan" });
NationalityInfo.Add(new Nationality() { Name = "土耳其", Value = "Turkey" });
NationalityInfo.Add(new Nationality() { Name = "土耳其2", Value = "Turkey2" });
NationalityInfo.Add(new Nationality() { Name = "土耳其3", Value = "Turkey3" });
NationalityInfo.Add(new Nationality() { Name = "土耳其4", Value = "Turkey4" });
NationalityInfo.Add(new Nationality() { Name = "土耳其5", Value = "Turkey5" });
}
private List<Nationality> nationalityInfo = new List<Nationality>();
public List<Nationality> NationalityInfo
{
get { return nationalityInfo; }
set { nationalityInfo = value; OnPropertyChanged("NationalityInfo"); }
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
使用DataGrid
<Grid Margin="10" >
<!--
AlternationCount="2" 表示两行交替显示背景色;
AutoGenerateColumns="False" 表示不让DataGrid自动生成列。如果设置成true,则效果: 多出了不需要的列;
HorizontalAlignment="Left" 不显示多余的空白列;
-->
<DataGrid Name="dg" ItemsSource="{Binding NationalityInfo}" AlternationCount="2" AutoGenerateColumns="False" IsReadOnly="True"
HorizontalAlignment="Left">
<DataGrid.Columns>
<DataGridTextColumn Width="150" Binding="{Binding Name}" Header="Name" ElementStyle="{StaticResource centerAlignmentStyle}"/>
<DataGridTextColumn Width="150" Binding="{Binding Value}" Header="Value" ElementStyle="{StaticResource centerAlignmentStyle}"/>
<DataGridTextColumn Width="150" Binding="{Binding Name}" Header="Name1"/>
<DataGridTextColumn Width="150" Binding="{Binding Value}" Header="Value1"/>
</DataGrid.Columns>
</DataGrid>
</Grid>
**************************************************************************************************************
4、效果图
**************************************************************************************************************
5、总结和扩展
SelectionUnit属性可以设置当鼠标点击DataGrid时获得焦点的是一个单元格或一个单元行,该属性会影响获取单元格的列索引。
CanUserAddRows属性设置是否在编辑行后再增加一行空白行,如果使用了数据源绑定,那么建议设置为False。
AutoGenerateColumns属性,如果使用了数据源绑定,那么应设置为False,否则相同的列会重复出现。
**************************************************************************************************************