需求
在使用WPF开发时,使用DataGrid
列表显示数据时,有些字段可以进行分组显示,用于更好的表达它们之间存在的某种关系,因此就考虑到要对DataGrid
的表头进行扩展,可以显示多行表头,让这些有关联的字段内容显示的更加明了简洁。
自定义样式
这段自定义样式可以放在MainWindow.xaml
文件中,或者自己定义一个存放样式文件的xaml
进行存放。这里在模版里面使用的第一个Grid
,是用于总的显示,还有右侧边竖线分割线,嵌入的Grid
用于显示多表头的处理显示功能:第一行为总的信息,第二行为第一行和第三行的分割线,第三行显示的省、市和县。
<Style x:Key="CityStyle" TargetType="DataGridColumnHeader"><Setter Property="Template"><Setter.Value><ControlTemplate><Grid x:Name="Root"><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition><ColumnDefinition Width="Auto"></ColumnDefinition></Grid.ColumnDefinitions><GridGrid.Column="0"HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"VerticalAlignment="{TemplateBinding VerticalContentAlignment}"><Grid.RowDefinitions><RowDefinition Height="30"></RowDefinition><RowDefinition Height="Auto"></RowDefinition><RowDefinition Height="30"></RowDefinition></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="100"></ColumnDefinition><ColumnDefinition Width="Auto"></ColumnDefinition><ColumnDefinition Width="100"></ColumnDefinition><ColumnDefinition Width="Auto"></ColumnDefinition><ColumnDefinition Width="100"></ColumnDefinition></Grid.ColumnDefinitions><ContentPresenterGrid.Row="0"Grid.Column="0"Grid.ColumnSpan="5"HorizontalAlignment="Center"VerticalAlignment="Center"Content="户籍信息"></ContentPresenter><RectangleGrid.Row="1"Grid.Column="0"Grid.ColumnSpan="5"VerticalAlignment="Stretch" Height="1"Fill="Black"Visibility="Visible"></Rectangle><ContentPresenterGrid.Row="2"Grid.Column="0"HorizontalAlignment="Center"VerticalAlignment="Center"Content="省"></ContentPresenter><RectangleGrid.Row="2"Grid.Column="1"Width="1"VerticalAlignment="Stretch"Fill="#ccc"Visibility="Visible"></Rectangle><ContentPresenterGrid.Row="2"Grid.Column="2"HorizontalAlignment="Center"VerticalAlignment="Center"Content="市"></ContentPresenter><RectangleGrid.Row="2"Grid.Column="3"Width="1"VerticalAlignment="Stretch"Fill="#ccc"Visibility="Visible"></Rectangle><ContentPresenterGrid.Row="2"Grid.Column="4"HorizontalAlignment="Center"VerticalAlignment="Center"Content="县"></ContentPresenter></Grid><RectangleGrid.Column="1"Width="1"VerticalAlignment="Stretch"Fill="#ccc"Visibility="Visible"></Rectangle></Grid></ControlTemplate></Setter.Value></Setter>
</Style>
窗体布局
<Grid><DataGridAutoGenerateColumns="False"CanUserAddRows="False"ItemsSource="{Binding UserInformations}"><DataGrid.Columns><DataGridTextColumn Width="100" Binding="{Binding UserName}"><DataGridTextColumn.HeaderTemplate><DataTemplate><Grid HorizontalAlignment="Stretch" VerticalAlignment="Center"><TextBlockMargin="5,0,5,0"HorizontalAlignment="Center"VerticalAlignment="Center"Text="姓名"TextAlignment="Center"TextWrapping="Wrap"></TextBlock></Grid></DataTemplate></DataGridTextColumn.HeaderTemplate><DataGridTextColumn.ElementStyle><Style><Setter Property="TextBlock.TextAlignment" Value="Center"></Setter><Setter Property="TextBlock.TextWrapping" Value="Wrap"></Setter><Setter Property="TextBlock.HorizontalAlignment" Value="Center"></Setter><Setter Property="TextBlock.VerticalAlignment" Value="Center"></Setter></Style></DataGridTextColumn.ElementStyle></DataGridTextColumn><DataGridTemplateColumn HeaderStyle="{StaticResource CityStyle}"><DataGridTemplateColumn.CellTemplate><DataTemplate><StackPanel Orientation="Horizontal"><TextBlockWidth="100"Margin="0"HorizontalAlignment="Center"VerticalAlignment="Center"Text="{Binding Province}"TextAlignment="Center"></TextBlock><Rectangle Width="1" Fill="Black"></Rectangle><TextBlockWidth="100"HorizontalAlignment="Center"VerticalAlignment="Center"Text="{Binding City}"TextAlignment="Center"></TextBlock><Rectangle Width="1" Fill="Black"></Rectangle><TextBlockWidth="100"HorizontalAlignment="Center"VerticalAlignment="Center"Text="{Binding County}"TextAlignment="Center"></TextBlock></StackPanel></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTextColumnWidth="100"Binding="{Binding Motto}"Header="格言"><DataGridTextColumn.HeaderStyle><Style><Setter Property="TextBlock.HorizontalAlignment" Value="Stretch"></Setter><Setter Property="TextBlock.TextAlignment" Value="Center"></Setter></Style></DataGridTextColumn.HeaderStyle><DataGridTextColumn.HeaderTemplate><DataTemplate><TextBlockHorizontalAlignment="Center"VerticalAlignment="Center"Text="格言"TextAlignment="Center"TextWrapping="Wrap"></TextBlock></DataTemplate></DataGridTextColumn.HeaderTemplate><DataGridTextColumn.ElementStyle><Style><Setter Property="TextBlock.TextAlignment" Value="Center"></Setter><Setter Property="TextBlock.TextWrapping" Value="Wrap"></Setter><Setter Property="TextBlock.HorizontalAlignment" Value="Center"></Setter><Setter Property="TextBlock.VerticalAlignment" Value="Center"></Setter></Style></DataGridTextColumn.ElementStyle></DataGridTextColumn></DataGrid.Columns></DataGrid>
</Grid>
在这里的窗体布局中,同时对姓名和格言的表头样式和Cell里面的样式进行了修改。其中DataGridTextColumn.HeaderTemplate
包括的是头部的样式;DataGridTextColumn.ElementStyle
包括的是Cell的样式。
定义的实体类
public class UserInformation{public string UserName { get; set; }public string Province { get; set; }public string City { get; set; }public string County { get; set; }public int Age { get; set; }public string Motto { get; set; }}
ViewModel类的定义
public class MainViewModel:ViewModelBase{private string _title;public string Title{get { return _title; }set { Set(ref _title, value); }}private ObservableCollection<UserInformation> _userInformations;public ObservableCollection<UserInformation> UserInformations{get { return _userInformations; }set { Set(ref _userInformations, value); }}public MainViewModel(){Title = Guid.NewGuid().ToString();UserInformations = new ObservableCollection<UserInformation>(new List<UserInformation>(){new UserInformation(){UserName = "Bob",Age = 32,Province = "山东",City = "济南",County = "天桥",Motto = "会当云绝顶,\r\n一览众山小。"},new UserInformation(){UserName = "Bob",Age = 32,Province = "山东",City = "济南",County = "天桥",Motto = "会当云绝顶,\r\n一览众山小。"},new UserInformation(){UserName = "Bob",Age = 32,Province = "山东",City = "济南",County = "天桥",Motto = "会当云绝顶,\r\n一览众山小。"}});}}
本实例使用了.netcore 3.1
版本进行的开发,但是对于.net framework
同样适用。
MVVM
模式是使用MVVMLightstd10
,可以从nuget上面进行下载。
— END —
「扩展阅读」
[GitHub] 75+的 C# 数据结构和算法实现
谁说.NET不适合搞BD,ML、AI
推荐一个集录屏、截图、音频于一体的软件给大家
10个用于C#.NET开发的基本调试工具
Xamarin.Forms 二维码扫描实践
在Asp.Net Core MVC 开发过程中遇到的问题总结
前端小白在asp.net core mvc中使用ECharts
基于Asp.Net Core MVC和AdminLTE的响应式管理后台之侧边栏处理
[译]如何在C#中调试LINQ查询
C# 语言性能提升方法
使用MQTTnet搭建Mqtt服务器
OxyPlot在WinForm中的应用
「公众号推荐」
回复:「redis」 获取5.0.9版的Windows安装包(exe)
回复:「ca」 获取 截图、GIF等工具三件套,便携版和安装版全部包括
回复:「新书」 获取《ASP.NET Core 3框架揭秘》
回复:「进阶」 获取 《CLR via C#(第4版)》购书链接
回复:「本质论」获取 《C# 7.0本质论》购书链接
回复:「WPF」获取 WPF 电子书