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、效果图

Ruby WPF控件_wpf

**************************************************************************************************************

5、总结和扩展

    SelectionUnit属性可以设置当鼠标点击DataGrid时获得焦点的是一个单元格或一个单元行,该属性会影响获取单元格的列索引。

    CanUserAddRows属性设置是否在编辑行后再增加一行空白行,如果使用了数据源绑定,那么建议设置为False。

    AutoGenerateColumns属性,如果使用了数据源绑定,那么应设置为False,否则相同的列会重复出现。

**************************************************************************************************************