【问题标题】:Datagrid custom header数据网格自定义标题
【发布时间】:2011-05-17 18:00:11
【问题描述】:

我想在 Datagrid 的标题行中添加一个额外的行,该行将包含文本框(用于搜索)。
此行应直接出现在原始标题下方,并且看起来像常规项目标题。

这是我目前的代码:

 <Window.Resources>
        <Style x:Key="DataGridColumnHeaderStyle1" TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">

                        <Grid VerticalAlignment="Center" HorizontalAlignment="Stretch">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <TextBlock Grid.Row="0" Text="" HorizontalAlignment="Stretch"/>
                            <Grid Grid.Row="1">
                                <TextBox Text="" HorizontalAlignment="Stretch" BorderThickness="1" />
                            </Grid>
                        </Grid>

                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <Grid x:Name="LayoutRoot">
        <DataGrid x:Name="dataGrid" Height="157" Width="600" Margin="8,8,24,0"
                  VerticalAlignment="Top"
                  AutoGenerateColumns="False"
                  ColumnHeaderStyle="{DynamicResource DataGridColumnHeaderStyle1}"
                  ItemsSource="{Binding}" CanUserAddRows="False"
                  >

            <DataGrid.Columns>
                <DataGridTextColumn Header="Header1" Binding="{Binding Id}" Width="100" />
                <DataGridTextColumn Header="Header2" Binding="{Binding Name}" Width="100"/>
                <DataGridTextColumn Header="Header3" Binding="{Binding Phone}" Width="100"/>
                <DataGridTextColumn Header="Header4" Binding="{Binding Address}" Width="100"/>
                <DataGridTextColumn Header="Header5" Binding="{Binding Description}" Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

我的 contentTemplate 的问题是它没有获得 .

中定义的“标题标题”

【问题讨论】:

    标签: wpf datagrid


    【解决方案1】:

    如果我理解正确,我认为你想要这样的东西:

    <TextBox Text="{TemplateBinding Content}" HorizontalAlignment="Stretch" BorderThickness="1" />
    

    这会将您在 Header 属性中键入的文本作为文本放入文本框中。

    编辑: 模板绑定有效,因为您正在从模板化标题绑定到您在样式之外定义的标题。换句话说,TemplateBinding 标记将源绑定为实际标头。

    为了更清楚一点,TemplateBindingBinding RelativeSource={RelativeSource TemplatedParent}} 相同。因此,这会在源是 DataGridColumnHeader 的情况下进行绑定。当这种样式应用于数据网格时,标题成为模板化的父级。所以绑定只是绑定到模板化父级的内容,即您的&lt;DataGridTextColumn Header="Header1" Binding="{Binding Id}" Width="100" /&gt;

    这是 msdn 的链接:TemplateBinding

    【讨论】:

    • 我需要文本块,但你是对的。能否请您解释一下 TemplateBinding Content 是如何绑定 Header 属性的?
    • 感谢您的出色回答,但请告诉我如何将这些文本框绑定到视图模型并使用它们过滤每一列?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多