在绑定到DataTable的WPF DataGrid上,如何一般更改列标题模板?

时间:2016-07-10 20:19:38

标签: c# wpf xaml datatable datagrid

从与项目另一部分的接口,我有一个DataTable对象,其中包含可变数量的列和行。我正在尝试设计一个DataGrid,它将通过绑定显示表格,但会为每个列自定义列标题,并提供一些选项(标题下的TextBox除外)。

这与之前提出的问题WPF Custom datagrid column header非常相似,只是我不想在WPF中定义列;而是在绑定期间传播到每列的列的模板。

上一个答案看起来正确,但当具有该WPF样式的DataGrid绑定到DataTable时,结果是一个静态单列,其中包含额外的红色边框TextBox ,加上一堆不包含文本框的绑定列:

<DataGrid>
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}"
                            Header="{Binding HeaderName}">
            <DataGridTextColumn.HeaderTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Content, RelativeSource=
                                     {RelativeSource Mode=TemplatedParent}}"
                                   Margin="5"/>
                        <TextBox BorderBrush="Red" BorderThickness="3"
                                 Width="50" Margin="5"/>
                    </StackPanel>
                </DataTemplate>
            </DataGridTextColumn.HeaderTemplate>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

不是让上面的WPF创建第一列,而是如何更改它以指定应该如何呈现绑定列的模板?

谢谢!

1 个答案:

答案 0 :(得分:2)

你可以在Style

中完成
<DataGrid.Resources>
    <Style TargetType="{x:Type DataGridColumnHeader}">
        <Style.Triggers>
            <Trigger Property="HasContent" Value="True">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding Content, RelativeSource=
                                           {RelativeSource Mode=TemplatedParent}}"/>
                                <TextBox BorderBrush="Red" BorderThickness="3"
                                         Width="50" Margin="5"/>
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>
</DataGrid.Resources>

整个DataGrid似乎还有一个“MainHeader”, 注意HasContent Trigger从Style中删除此标题。