如何隐藏/删除WPF ColumnHeaderStyle列标题?

时间:2015-08-12 19:43:16

标签: c# wpf datagrid

我有一个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;
        }
 }

1 个答案:

答案 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复制粘贴默认值。