我有一个DataGrid ColumnHeaderStyle问题,在我的情况下,我想将这些组件(文本块,按钮)添加到所有列标题,但也生成了错误/假的列标题,因此出现带有标题的列(Dosage + Btn) ,药物+ Btn,患者+ Btn,日期+ Btn),加上没有标题名称的假列标题,其中只包含一个按钮 - > "" + btn。 Datagrid没有预定义的列。 我的问题是我如何隐藏/删除/禁用或取消这个假列标题? 有什么建议吗?
XAML:
<Window.Resources>
<Style x:Key="dgheaderstyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}" >
<StackPanel Orientation="Horizontal" >
<TextBlock Text="{Binding}" />
<Button Content="Click"></Button>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<DataGrid ItemsSource="{Binding}" ColumnHeaderStyle="{StaticResource dgheaderstyle}" HorizontalAlignment="Left" Height="262" Margin="10,21,0,0" VerticalAlignment="Top" Width="472">
</DataGrid>
</Grid>
代码背后:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataTable table = new DataTable();
table.Columns.Add("Dosage", typeof(int));
table.Columns.Add("Drug", typeof(string));
table.Columns.Add("Patient", typeof(string));
table.Columns.Add("Date", typeof(DateTime));
table.Rows.Add(25, "Indocin", "David", DateTime.Now);
table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
DataContext = table;
}
}
答案 0 :(得分:3)
这是一个棘手的问题所以请耐心等待。 额外的DataGridColumn标头名为 PART_FillerColumnHeader 。 它位于 PART_ColumnHeadersPresenter 中的ItemsPresenter后面。
DataGridTemplate的简化(并非真正包含所有内容,只包含相关部分)。
<ControlTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter"
Style="{StaticResource DataGridColumnHeaderStyle}"/>
<ScrollContentPresenter Grid.Row="1" x:Name="PART_ScrollContentPresenter" />
</Grid>
</ControlTemplate>
我们的兴趣在于 DataGridColumnHeadersPresenter ,让我们一起来看看。 的简化强>
<Style x:Key="DataGridColumnHeadersPresenterStyle" TargetType="{x:Type DataGridColumnHeadersPresenter}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeadersPresenter}">
<Grid>
<DataGridColumnHeader x:Name="PART_FillerColumnHeader" IsHitTestVisible="False" />
<ItemsPresenter />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
现在DataGridColumnHeadersPresenter的ItemContainers属于DataGridColumnHeader类型。 将ColumnHeaderStyle分配给DataGrid时。它适用于DataGridColumnHeaderPresenter的Items和 PART_FillerColumnHeader AS WELL。
如上所示 PART_FillerColumnHeader 位于ItemsPresenter后面。 ColumnHeadersPresenter的Items被渲染到ItemsPrsenter(意味着所有其他列标题)。这就是为什么你会看到额外的列标题。 您在列标题后面看到的额外列标题。
现在如何摆脱它。简单地为它指定一种自己的风格。
您可以使用Blend复制粘贴默认值。