首页 > 解决方案 > 继承 DatagridColumnHeader 并使用它

问题描述

我创建了一个继承自 datagridcolumnheader 的类。我设置了它的样式(现在使用原始 datagridcolumnheader 的默认样式)但我不知道如何强制我的列使用这个 customDatagridcolumnHeader。

我试过这个:

<DataGridTextColumn Binding="{Binding Donateur}" Width="*">
                        <DataGridTextColumn.Header>
                            <local:CustomDatagridColumnHeader/>
                        </DataGridTextColumn.Header>          
                    </DataGridTextColumn>

它不起作用,我明白为什么。如何做这样的事情?我试图修改默认的 DatagridColumnHeadersPresenter,但它只有两个部分,PART_FillerColumnHeader(我可以替换)和 itemsPresenter。目的是在新类上添加属性、函数和事件(只是试图为过滤器提供文本框,但不是针对所有列,也不是针对所有数据网格)。我“认为”我可以通过直接继承数据网格,然后通过树找到文本框来找到一种方法,但这对于我想做的所有事情都不是很实用(比如隐藏一列的文本框)

编辑:这是未来的模板

<Style TargetType="local:RafDatagridColumnHeader">
    <Style.Resources>
        <local:IsNotNothingConverter x:Key="IsNotNothingConverter"/>
        <local:IsNotNothingToVisibilityConverter x:Key="IsNotNothingToVisibilityConverter"/>
    </Style.Resources>
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock TextWrapping="Wrap" Text="{Binding}" VerticalAlignment="Center"></TextBlock>
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:RafDatagridColumnHeader">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>

                    <Grid Grid.Row="0" Visibility="{Binding Column, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:RafDatagridColumnHeader}, Converter={StaticResource IsNotNothingToVisibilityConverter}}">
                        <TextBox HorizontalAlignment="Stretch" Margin="3"/>
                    </Grid>

                    <theme:DataGridHeaderBorder Grid.Row="1" SortDirection="{TemplateBinding SortDirection}"
                                IsHovered="{TemplateBinding IsMouseOver}"
                                IsPressed="{TemplateBinding IsPressed}"
                                IsClickable="{TemplateBinding CanUserSort}"
                                Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                Padding ="{TemplateBinding Padding}"
                                SeparatorVisibility="{TemplateBinding SeparatorVisibility}"
                                SeparatorBrush="{TemplateBinding SeparatorBrush}" VerticalAlignment="Stretch">


                        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                            RecognizesAccessKey="True" />

                    </theme:DataGridHeaderBorder>

                    <Thumb x:Name="PART_LeftHeaderGripper"  Grid.Row="1"
                        HorizontalAlignment="Left"
                        Style="{StaticResource ColumnHeaderGripperStyle}"/>
                    <Thumb x:Name="PART_RightHeaderGripper"  Grid.Row="1"
                        HorizontalAlignment="Right"
                        Style="{StaticResource ColumnHeaderGripperStyle}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

如果我修改控件 DataTemplate 而不是模板本身,我将失去列标题的所有好东西(排序、排序字形、拇指改变宽度、重新排序......)好吧,事实上,我不会,但文本框将在标题内,排序字形将在顶部...顺便说一句,它更好,更具可读性

标签: wpfinheritancedatagridcolumnheader

解决方案


推荐阅读