C# 使用DataGrid在一列中显示多个标题
我希望在以下列中包含多个属性:C# 使用DataGrid在一列中显示多个标题,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我希望在以下列中包含多个属性: 现在,创建一个单元格模板来显示多个属性很容易,但是如何创建一个标题模板来显示多个属性,并且仍然允许您通过单击它们进行排序呢?因此,只需单击first name标题,您就可以按名字排序,其他所有属性也是如此。您可以使用两个TextBlock。在标记属性中,您应该从数据类中转移属性的名称。此字符串来自标记属性,用于设置SortMemberPath。在事件MouseLeftButtonDown中,您可以从Tag获取实际排序属性的属性名称,并将其分配给SortMembe
现在,创建一个单元格模板来显示多个属性很容易,但是如何创建一个标题模板来显示多个属性,并且仍然允许您通过单击它们进行排序呢?因此,只需单击
first name
标题,您就可以按名字排序,其他所有属性也是如此。您可以使用两个TextBlock
。在标记
属性中,您应该从数据类中转移属性的名称。此字符串来自标记
属性,用于设置SortMemberPath
。在事件MouseLeftButtonDown
中,您可以从Tag
获取实际排序属性的属性名称,并将其分配给SortMemberPath
<DataGrid Name="dataGrid1" ItemsSource="{Binding}" AutoGenerateColumns="False" Margin="0,0,0,52">
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.HeaderTemplate >
<DataTemplate>
<Grid ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="First Name" Tag="FirstName" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" />
<TextBlock Text="Last Name" Grid.Row="1" Tag="LastName" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" />
</Grid>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBox Text="{Binding FirstName}"/>
<TextBox Text="{Binding LastName}" Grid.Row="1" />
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Age" Binding="{Binding Age}" />
</DataGrid.Columns>
</DataGrid>
如果您想显示哪个属性当前正在对属性进行排序并以粗体字体显示,还可以添加TextBlock
样式
<DataGridTemplateColumn.HeaderTemplate >
<DataTemplate>
<Grid ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="First Name" Tag="FirstName" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="FontWeight" Value="Normal" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Columns[0].SortMemberPath, ElementName=dataGrid1}">
<DataTrigger.Value>
<sys:String>FirstName</sys:String>
</DataTrigger.Value>
<Setter Property="FontWeight" Value="Bold" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock Text="Last Name" Grid.Row="1" Tag="LastName" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" >
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="FontWeight" Value="Normal" />
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Columns[0].SortMemberPath, ElementName=dataGrid1}">
<DataTrigger.Value>
<sys:String>LastName</sys:String>
</DataTrigger.Value>
<Setter Property="FontWeight" Value="Bold" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
看看:
并更改DataGrid列的标题,如下例所示:
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock.Text>
<MultiBinding StringFormat="{}{1}{0}{2}">
<Binding Source="{x:Static sys:Environment.NewLine}"/>
<Binding Path="FirstName" />
<Binding Path="LastName"/>
</MultiBinding>
</TextBlock>
</DataGridTemplateColumn.Header>
</DataGrid.Columns>
</DataGrid>
使用xmlns:sys=“clr namespace:System;assembly=mscorlib”
可能会很有帮助
xmlns:sys="clr-namespace:System;assembly=mscorlib"
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.Header>
<TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBlock.Text>
<MultiBinding StringFormat="{}{1}{0}{2}">
<Binding Source="{x:Static sys:Environment.NewLine}"/>
<Binding Path="FirstName" />
<Binding Path="LastName"/>
</MultiBinding>
</TextBlock>
</DataGridTemplateColumn.Header>
</DataGrid.Columns>
</DataGrid>