【WPF】DataGrid多表头的样式设计

    技术2022-07-10  107

    需求

    在使用WPF开发时,使用DataGrid列表显示数据时,有些字段可以进行分组显示,用于更好的表达它们之间存在的某种关系,因此就考虑到要对DataGrid的表头进行扩展,可以显示多行表头,让这些有关联的字段内容显示的更加明了简洁。

    image

    自定义样式

    这段自定义样式可以放在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>                     <Grid                                 Grid.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>                         <ContentPresenter                                     Grid.Row="0"                                     Grid.Column="0"                                     Grid.ColumnSpan="5"                                     HorizontalAlignment="Center"                                     VerticalAlignment="Center"                                     Content="户籍信息">                         </ContentPresenter>                         <Rectangle                                     Grid.Row="1"                                     Grid.Column="0"                                     Grid.ColumnSpan="5"                                     VerticalAlignment="Stretch" Height="1"                                     Fill="Black"                                     Visibility="Visible">                         </Rectangle>                         <ContentPresenter                                     Grid.Row="2"                                     Grid.Column="0"                                     HorizontalAlignment="Center"                                     VerticalAlignment="Center"                                     Content="省">                         </ContentPresenter>                         <Rectangle                                     Grid.Row="2"                                     Grid.Column="1"                                     Width="1"                                     VerticalAlignment="Stretch"                                     Fill="#ccc"                                     Visibility="Visible">                         </Rectangle>                         <ContentPresenter                                     Grid.Row="2"                                     Grid.Column="2"                                     HorizontalAlignment="Center"                                     VerticalAlignment="Center"                                     Content="市">                         </ContentPresenter>                         <Rectangle                                     Grid.Row="2"                                     Grid.Column="3"                                     Width="1"                                     VerticalAlignment="Stretch"                                     Fill="#ccc"                                     Visibility="Visible">                         </Rectangle>                         <ContentPresenter                                     Grid.Row="2"                                     Grid.Column="4"                                     HorizontalAlignment="Center"                                     VerticalAlignment="Center"                                     Content="县">                         </ContentPresenter>                     </Grid>                     <Rectangle                                 Grid.Column="1"                                 Width="1"                                 VerticalAlignment="Stretch"                                 Fill="#ccc"                                 Visibility="Visible">                     </Rectangle>                 </Grid>             </ControlTemplate>         </Setter.Value>     </Setter> </Style>

    窗体布局

    <Grid>     <DataGrid             AutoGenerateColumns="False"             CanUserAddRows="False"             ItemsSource="{Binding UserInformations}">         <DataGrid.Columns>             <DataGridTextColumn Width="100" Binding="{Binding UserName}">                 <DataGridTextColumn.HeaderTemplate>                     <DataTemplate>                         <Grid HorizontalAlignment="Stretch" VerticalAlignment="Center">                             <TextBlock                                     Margin="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">                             <TextBlock                                     Width="100"                                     Margin="0"                                     HorizontalAlignment="Center"                                     VerticalAlignment="Center"                                     Text="{Binding Province}"                                     TextAlignment="Center">                             </TextBlock>                             <Rectangle Width="1" Fill="Black">                             </Rectangle>                             <TextBlock                                     Width="100"                                     HorizontalAlignment="Center"                                     VerticalAlignment="Center"                                     Text="{Binding City}"                                     TextAlignment="Center">                             </TextBlock>                             <Rectangle Width="1" Fill="Black">                             </Rectangle>                             <TextBlock                                     Width="100"                                     HorizontalAlignment="Center"                                     VerticalAlignment="Center"                                     Text="{Binding County}"                                     TextAlignment="Center">                             </TextBlock>                         </StackPanel>                     </DataTemplate>                 </DataGridTemplateColumn.CellTemplate>             </DataGridTemplateColumn>             <DataGridTextColumn                     Width="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>                         <TextBlock                                 HorizontalAlignment="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上面进行下载。

    本示例已上传至GITHUB:https://github.com/mzy666888/MultiHeaderOfDataGridWpfApp

    — 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 电子书


    Processed: 0.015, SQL: 9