掌握WPF控件:熟练常用属性(三)
DataGrid
用于显示和编辑数据的表格控件。它可以从多种数据源(如SQL数据库、LINQ查询或任何其他可绑定的数据源)中显示和编辑数据,支持排序、筛选、分页等功能。
DataGrid基本相关属性
基础属性 描述 ItemsSource 用来DataGrid中显示的数据源,可以直接绑定到一个集合对象,也可以手动创建列并绑定到集合中的属性。 IsReadOnly 用来设置DataGrid是否为只读,默认为false。如果设置为只读,用户将无法编辑单元格。 HeadersVisibility 用来设置是否显示行头和列头。默认值为 All,可选值有:None、Column、Row、All。 ClipboardCopyMode 用来获取或设置一个值,该值指示如何将内容复制到剪贴板。可选值包括None、ExcludeHeader、IncludeHeader和All。比如是否可以将数据从 DataGrid 控件复制到剪贴板,以及是否包含列标题值。 CellStyle 用来获取或设置应用来DataGrid 中所有单元格的样式。 GridLinesVisibility 获取或设置一个值,该值指示显示哪些网格线。可选值有:All(水平垂直)、Horizontal(水平)、None(无),Vertical(垂直) HorizontalGridLinesBrush 用来获取或设置水平网格线的笔刷。 VerticalGridLinesBrush 用来获取或设置用于绘制垂直网格线的画笔。 HorizontalScrollBarVisibility 用来获取或设置水平滚动条的显示方式。可选值:Auto(需要时显示)、Visible(始终显示)、Hidden(始终不显示) VerticalScrollBarVisibility 获取或设置一个值,该值指示垂直滚动条在 DataGrid 中的显示方式。可选值:Auto(需要时显示)、Visible(始终显示)、Hidden(始终不显示)
下面实现一个基本的DataGrid列表,实现绑定数据
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<!--第一个自动生成列,设置列宽为100-->
<DataGrid Grid.Row="0" x:Name="myDataGrid" ColumnWidth="100"></DataGrid>
<!--第二个设置不自动生成列 AutoGenerateColumns=False,并且设置列宽为100-->
<!--设置复制时包括列头ClipboardCopyMode ="IncludeHeader"-->
<DataGrid Grid.Row="1" x:Name="myDataGrid1" AutoGenerateColumns="False" ColumnWidth="100" ClipboardCopyMode ="IncludeHeader">
<DataGrid.Columns>
<!-- 定义列 -->
<DataGridTextColumn Header="ID" Binding="{Binding Id}" />
<DataGridTextColumn Header="姓名" Binding="{Binding Name}" />
<DataGridTextColumn Header="年龄" Binding="{Binding Age}" />
</DataGrid.Columns>
</DataGrid>
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center" Height="40">
<Button Content="隐藏/显示行头和列头" Click="Button_Click"></Button>
<Button Content="设置/取消单元格样式" Click="Button_Click_1" Margin="10,0"></Button>
<Button Content="设置/取消列头样式" Click="Button_Click_2" Margin="10,0"></Button>
<Button Content="设置/取消网格线" Click="Button_Click_3" Margin="10,0"></Button>
</StackPanel>
</Grid>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
namespace WpfCommonControls
{
/// <summary>
/// DataGrid.xaml 的交互逻辑
/// </summary>
public partial class DataGrid : Window
{
static Random random = new Random();
public DataGrid()
{
InitializeComponent();
LoadData();
// 设置滚动条始终不显示
myDataGrid.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden;
//设置垂直滚动条必要时显示
myDataGrid.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;
}
private void LoadData()
{
List<PersonModel> list = new List<PersonModel>
{
new PersonModel { Id=random.Next(1, 10001), Name = "张三", Age = random.Next(18, 61) },
new PersonModel {Id=random.Next(1, 10001), Name = "李四", Age = random.Next(18, 61) },
new PersonModel {Id=random.Next(1, 10001), Name = "王二", Age = random.Next(18, 61) },
new PersonModel {Id=random.Next(1, 10001), Name = "麻子", Age = random.Next(18, 61) }
};
// 绑定第一个DataGrid
myDataGrid.ItemsSource = list;
// 设置第二个DataGrid的数据上下文
myDataGrid1.ItemsSource = list;
}
public class PersonModel
{
/// <summary>
/// ID
/// </summary>
public int Id { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string? Name { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
}
private void Button_Click(object sender, RoutedEventArgs e)
{
// 隐藏/显示行和列头
myDataGrid.HeadersVisibility = myDataGrid.HeadersVisibility== DataGridHeadersVisibility.None? DataGridHeadersVisibility.All: DataGridHeadersVisibility.None;
myDataGrid1.HeadersVisibility = myDataGrid1.HeadersVisibility == DataGridHeadersVisibility.None ? DataGridHeadersVisibility.All : DataGridHeadersVisibility.None;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
if (myDataGrid.Columns[0].CellStyle != null || myDataGrid1.Columns[0].CellStyle != null)
{
myDataGrid.Columns[0].CellStyle = null; // 取消第一列的单元格样式
myDataGrid1.Columns[0].CellStyle = null; // 取消第一列的单元格样式
}
else
{
//设置单元格样式
Style cellStyle = new Style(typeof(DataGridCell));
cellStyle.Setters.Add(new Setter(BackgroundProperty, Brushes.LightBlue)); // 设置背景
cellStyle.Setters.Add(new Setter(ForegroundProperty, Brushes.Black)); // 设置字体颜色
cellStyle.Setters.Add(new Setter(BorderBrushProperty, Brushes.DarkBlue)); // 设置边框颜色
cellStyle.Setters.Add(new Setter(BorderThicknessProperty, new Thickness(2))); //设置边框线
myDataGrid.Columns[0].CellStyle = cellStyle; // 设置第一列的单元格样式
myDataGrid1.Columns[0].CellStyle = cellStyle; // 设置第一列的单元格样式
}
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
if (myDataGrid.ColumnHeaderStyle != null || myDataGrid1.ColumnHeaderStyle != null)
{
myDataGrid.ColumnHeaderStyle = null; // 取消列头样式
myDataGrid1.ColumnHeaderStyle = null; // 取消列头样式
}
else
{
// 设置列头样式
Style cellStyle = new Style(typeof(DataGridColumnHeader));
cellStyle.Setters.Add(new Setter(BackgroundProperty, Brushes.LightBlue)); // 设置背景
cellStyle.Setters.Add(new Setter(ForegroundProperty, Brushes.Black)); // 设置字体颜色
cellStyle.Setters.Add(new Setter(BorderBrushProperty, Brushes.DarkBlue)); // 设置边框颜色
cellStyle.Setters.Add(new Setter(BorderThicknessProperty, new Thickness(2))); //设置边框线
myDataGrid.ColumnHeaderStyle = cellStyle; // 设置列头样式
myDataGrid1.ColumnHeaderStyle = cellStyle; // 设置列头样式
}
}
private void Button_Click_3(object sender, RoutedEventArgs e)
{
// 设置/取消网格线
myDataGrid.GridLinesVisibility = myDataGrid.GridLinesVisibility == DataGridGridLinesVisibility.None ? DataGridGridLinesVisibility.All : DataGridGridLinesVisibility.None;
myDataGrid1.GridLinesVisibility = myDataGrid1.GridLinesVisibility == DataGridGridLinesVisibility.None ? DataGridGridLinesVisibility.All : DataGridGridLinesVisibility.None;
}
}
}
DataGrid行相关属性
行相关属性 描述 AlternatingRowBackground 用来获取或设置交替行背景颜色。 AreRowDetailsFrozen 用来控制是否冻结行详细信息部分的内容。当AreRowDetailsFrozen属性设置为true时,表示行详细信息部分的内容不会水平滚动出视图,即被冻结。这样可以提高性能,特别是在处理大量数据时,因为行详细信息部分的内容不需要随着行的滚动而重新绘制。通常该属性的默认值为false。 CanUserAddRows 用来获取或设置一个值(默认为true),该值指示用户是否可在 DataGrid 中添加新行。 CanUserDeleteRows 用来获取或设置一个值(默认为true),该值指示用户是否可从 DataGrid 中删除行。 CanUserResizeRows 用来获取或设置一个值(默认为true),该值指示用户是否可以使用鼠标调整行的高度。 CurrentItem 用来获取或设置当前选中的项。 RowDetailsTemplate 用来获取或设置显示行详细信息的模板。 RowDetailsVisibilityMode 用来获取或设置一个值,该值指示何时显示行的详细信息部分。 SelectedIndex 用来获取或设置当前选中行的索引。 SelectedItem 用来获取或设置当前选中行绑定的数据项。 RowBackground和RowStyle 用来获取或设置填充行的背景颜色和行样式。 MinRowHeight 用来获取或设置 DataGrid 中行和标题的最小高度约束。它是个double 类型值。 RowHeight 用来获取或设置所有行的建议高度。 RowValidationRules 用来获取用于验证每行中的数据的规则。
```<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<!--设置 AlternatingRowBackground交替行的背景颜色,如总行数小于2时,则需要AlternationCount 设置为2-->
<!--设置CanUserAddRows =false 禁止添加行,设置为false 后,底部不会多出一个空行-->
<!--设置CanUserDeleteRows=false会禁止delete键删除行数据-->
<!--设置CanUserResizeRows为false,禁止拖动设置行高,鼠标移动到行的最左边,鼠标不会出现可以拖动样式-->
<!--设置最小行高为MinRowHeight=30.0,注意它的类型为double类型 -->
<DataGrid Grid.Row="0" x:Name="myDataGrid" AutoGenerateColumns="False" ColumnWidth="100" AlternatingRowBackground="LightBlue" AlternationCount ="2" CanUserAddRows ="False" CanUserDeleteRows="False" CanUserResizeRows="False" MinRowHeight="30.0">
<DataGrid.Columns>
<!-- 定义列 -->
<DataGridTextColumn Header="ID" Binding="{Binding Id}" />
<DataGridTextColumn Header="姓名" Binding="{Binding Name}" />
<DataGridTextColumn Header="年龄" Binding="{Binding Age}" />
</DataGrid.Columns>
</DataGrid>
<Button Grid.Row="1" Height="50" Width="180" Content="设置/或获取当前选中的行" Click="Button_Click"></Button>
</Grid>
```using System.ComponentModel;
using System.Windows;
namespace WpfCommonControls
{
/// <summary>
/// RowDataGrid.xaml 的交互逻辑
/// </summary>
public partial class RowDataGrid : Window
{
static Random random = new Random();
public RowDataGrid()
{
InitializeComponent();
LoadData();
}
private void LoadData()
{
List<PersonModel> list = new List<PersonModel>
{
new PersonModel { Id=random.Next(1, 10001), Name = "张三", Age = random.Next(18, 61) },
new PersonModel {Id=random.Next(1, 10001), Name = "李四", Age = random.Next(18, 61) },
new PersonModel {Id=random.Next(1, 10001), Name = "王二", Age = random.Next(18, 61) },
new PersonModel {Id=random.Next(1, 10001), Name = "麻子", Age = random.Next(18, 61) }
};
// 绑定DataGrid
myDataGrid.ItemsSource = list;
}
public class PersonModel: INotifyPropertyChanged
{
/// <summary>
/// ID
/// </summary>
private int id;
public int Id { get { return id; } set {
if (id != value)
{
id = value;
OnPropertyChanged("Id");
}
}
}
/// <summary>
/// 姓名
/// </summary>
private string? name;
public string? Name {
get { return name; }
set{
if (name != value)
{
name = value;
OnPropertyChanged("Name");
}
}
}
/// <summary>
/// 年龄
/// </summary>
private int age;
public int Age
{
get { return age; }
set
{
if (age != value)
{
age = value;
OnPropertyChanged("Age");
}
}
}
// 实现INotifyPropertyChanged接口
public event PropertyChangedEventHandler? PropertyChanged;
// 当属性值更改时,触发此方法
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
//要想修改当前行必须要实现INotifyPropertyChanged接口
var currItem = myDataGrid.SelectedItem as PersonModel;
if (currItem == null)
{
MessageBox.Show("请选中指定行");
return;
}
currItem.Id = 111;
currItem.Name = "手动设置行";
currItem.Age = 100;
// 在UI线程中设置新的SelectedItem
Application.Current.Dispatcher.Invoke(() =>
{
//myDataGrid.SelectedItem = currItem;
//或者
myDataGrid.CurrentItem = currItem; // 将当前选中项设置为item
});
}
}
}
DataGrid列相关属性
列相关属性 描述 AutoGenerateColumns 用来决定是否自动生成列。如果设置为true,DataGrid将自动按列名生成列,并将列绑定到集合中的属性。默认值为true。 CanUserReorderColumns 用来获取或设置一个值,该值指示用户是否可以通过使用鼠标拖动列标题来更改列显示顺序。 CanUserResizeColumns 用来获取或设置一个值,该值指示用户是否可以使用鼠标调整列的宽度。 CanUserSortColumns 用来获取或设置一个值,该值指示用户是否可以通过单击列标题对列进行排序。 ColumnHeaderHeight 用来获取或设置列标题行的高度。该值为double 类型。 ColumnHeaderStyle 用来获取或设置列头的样式。 Columns 用来获取一个集合,其中包含 DataGrid 中的所有列。 CurrentColumn 用来获取或设置包含当前单元格的列。 ColumnWidth 用来获取或设置列的宽度。 MaxColumnWidth 用来获取或设置DataGrid的最大列宽。 MinColumnWidth 用来获取或设置DataGrid的最小列宽。
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<!--设置AutoGenerateColumns为false,不自动生成列-->
<!--设置CanUserReorderColumns为false,不允许拖动列-->
<!--设置CanUserResizeColumns为false,不允许拖动列调整宽度,鼠标放上去不出现可拖动图标-->
<!--设置CanUserSortColumns为false,禁止点击列头,进行列排序-->
<!--设置ColumnHeaderHeight为30.0 标题行高度,注意值为double 类型-->
<!--设置MaxColumnWidth为80.0,最大列宽-->
<DataGrid Grid.Row="0" x:Name="myDataGrid" AutoGenerateColumns="False" ColumnWidth="100" AlternatingRowBackground="LightBlue" AlternationCount ="2" CanUserAddRows ="False" CanUserDeleteRows="False" CanUserResizeRows="False" MinRowHeight="30.0" CanUserReorderColumns ="False" CanUserResizeColumns="False" CanUserSortColumns="False" ColumnHeaderHeight="30.0" MaxColumnWidth="80.0">
<DataGrid.Columns>
<!-- 定义列 -->
<DataGridTextColumn Header="ID" Binding="{Binding Id}" />
<DataGridTextColumn Header="姓名" Binding="{Binding Name}" />
<DataGridTextColumn Header="年龄" Binding="{Binding Age}" />
</DataGrid.Columns>
</DataGrid>
<Button Grid.Row="1" Height="50" Width="150" Content="设置/取消标题行样式" Click="Button_Click"></Button>
</Grid>
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
namespace WpfCommonControls
{
/// <summary>
/// CellDataGrid.xaml 的交互逻辑
/// </summary>
public partial class CellDataGrid : Window
{
static Random random = new Random();
public CellDataGrid()
{
InitializeComponent();
LoadData();
}
private void LoadData()
{
List<PersonModel> list = new List<PersonModel>
{
new PersonModel { Id=random.Next(1, 10001), Name = "张三", Age = random.Next(18, 61) },
new PersonModel {Id=random.Next(1, 10001), Name = "李四", Age = random.Next(18, 61) },
new PersonModel {Id=random.Next(1, 10001), Name = "王二", Age = random.Next(18, 61) },
new PersonModel {Id=random.Next(1, 10001), Name = "麻子", Age = random.Next(18, 61) }
};
// 绑定DataGrid
myDataGrid.ItemsSource = list;
}
public class PersonModel : INotifyPropertyChanged
{
/// <summary>
/// ID
/// </summary>
private int id;
public int Id
{
get { return id; }
set
{
if (id != value)
{
id = value;
OnPropertyChanged("Id");
}
}
}
/// <summary>
/// 姓名
/// </summary>
private string? name;
public string? Name
{
get { return name; }
set
{
if (name != value)
{
name = value;
OnPropertyChanged("Name");
}
}
}
/// <summary>
/// 年龄
/// </summary>
private int age;
public int Age
{
get { return age; }
set
{
if (age != value)
{
age = value;
OnPropertyChanged("Age");
}
}
}
// 实现INotifyPropertyChanged接口
public event PropertyChangedEventHandler? PropertyChanged;
// 当属性值更改时,触发此方法
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (myDataGrid.ColumnHeaderStyle != null)
{
myDataGrid.ColumnHeaderStyle = null; // 取消列头样式
}
else
{
// 设置列头样式
Style cellStyle = new Style(typeof(DataGridColumnHeader));
cellStyle.Setters.Add(new Setter(BackgroundProperty, Brushes.LightPink)); // 设置背景
cellStyle.Setters.Add(new Setter(ForegroundProperty, Brushes.Black)); // 设置字体颜色
cellStyle.Setters.Add(new Setter(BorderBrushProperty, Brushes.DarkBlue)); // 设置边框颜色
cellStyle.Setters.Add(new Setter(BorderThicknessProperty, new Thickness(1))); //设置边框线
myDataGrid.ColumnHeaderStyle = cellStyle; // 设置列头样式
}
}
}
}
公众号“点滴分享技术猿 ”