Search code examples
custom-controlswpfdatagrid

WPF custom datagrid phantom header overlap


I have written a custom control which derives from Datagrid. When I use the custom grid, it displays an overlapping column header behind others and I'm not sure why. Here's a screenshot of my issue:

Phantom column header overlapping actual columns

Here's the XAML I use to call it:

<FDG:FilterDataGrid x:Name ="Jurisds"  MaxHeight="400" AutoGenerateColumns="False" VerticalScrollBarVisibility="Visible" HeadersVisibility="Column">
<DataGrid.Columns>
    <DataGridTextColumn Header="Region" Binding = "{Binding Region, Mode=OneWay}"/>
    <DataGridTextColumn Header = "Municipality" Binding = "{Binding Jurisd, Mode=OneWay}"/>
    <DataGridTextColumn Header = "Analysis" Binding = "{Binding AnalysisExists, Mode=OneWay}" />
    <DataGridTextColumn Header = "Brief" Binding = "{Binding StratBriefExists, Mode=OneWay}" />
    <DataGridHyperlinkColumn Header="Missing Nbhds" Binding="{Binding MissingNbhds, Mode=OneWay}">
    <DataGridHyperlinkColumn.ElementStyle>
        <Style>
        <EventSetter Event="Hyperlink.Click" Handler="nbhdsScreen"/>
        </Style>
    </DataGridHyperlinkColumn.ElementStyle>
    </DataGridHyperlinkColumn>
    <DataGridHyperlinkColumn Header="All Strats Approved" Binding="{Binding StratsApproved, Mode=OneWay}">
    <DataGridHyperlinkColumn.ElementStyle>
        <Style>
        <EventSetter Event="Hyperlink.Click" Handler="stratsScreen"/>
        </Style>
    </DataGridHyperlinkColumn.ElementStyle>
    </DataGridHyperlinkColumn>
</DataGrid.Columns>
</FDG:FilterDataGrid>

In the code-behind I set the ItemsSource to an object called JurisdictionData. It looks like it's auto-generating a column header and then generating the proper columns. Why is it creating this JurisdictionData header and how do I stop/remove it?


Solution

  • A DataGridColumnHeader object uses contains a DataGridColumnHeadersPresenter object. The custom Data Grid that I wrote create a custom style for the DataGridColumnHeader, but not for the DataGridColumnHeadersPresenter. To correct the issue, I created a style for the DataGridColumnHeadersPresenter which contained only the ItemsPresenter in the custom datagrid Style.Resources section.

    <Style  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>
    

    Answer about PART_FillerColumnHeader.