Wpf datagrid列标题为Grid

时间:2013-12-26 13:35:13

标签: wpf datagrid header

我有像这样的自定义列的DataGrid

<DataGridTemplateColumn Width="2*">
    <DataGridTemplateColumn.CellTemplate>
         <DataTemplate>
             <Grid>
                 <Grid.ColumnDefinitions>
                     <ColumnDefinition Width="*"></ColumnDefinition>
                     <ColumnDefinition Width="*"></ColumnDefinition>
             </Grid.ColumnDefinitions>
             <TextBlock Grid.Column="0" Text="{Binding SomeProperty}"/> 
             <TextBlock Grid.Column="0" Text="{Binding OtherProperty}"/>     
             </Grid>
         </DataTemplate>
      </DataGridTemplateColumn.CellTemplate>
 </DataGridTemplateColumn>
 <DataGridTextColumn Width="*" Header="Const" Binding="{Binding ConstantValue}" />

如您所见,第一列具有第二列的双倍宽度并包含两个texblock。所以我需要make header包含两个单词。相应TexBlock以上的每个字。我尝试使用带有两列的Grid(因为我有两列中的文本块)作为HeaderTemplate。我尝试将HeaderStyle设置为

<DataGridTemplateColumn.HeaderStyle>
     <Style TargetType="{x:Type DataGridColumnHeader}">
            <Style.Setters>
                  <Setter Property="ContentTemplate">
                         <Setter.Value>
                              <DataTemplate>
                                    <Grid>
                                         <Grid.ColumnDefinitions>
                                              <ColumnDefinition Width="*"></ColumnDefinition>
                                              <ColumnDefinition Width="*"></ColumnDefinition>
                                         </Grid.ColumnDefinitions>
                                    <TextBlock Grid.Column="0" HorizontalAlignment="Center">Header1</TextBlock>
                                    <TextBlock Grid.Column="1" HorizontalAlignment="Center">Header2</TextBlock>
                                    </Grid>
                              </DataTemplate>
                         </Setter.Value>
                   </Setter>
           </Style.Setters>
     </Style>

我尝试使用HeaderTemplate之类的

<DataGridTemplateColumn.HeaderTemplate>
     <DataTemplate>
          <Grid>
                <Grid.ColumnDefinitions>
                     <ColumnDefinition Width="*"></ColumnDefinition>
                     <ColumnDefinition Width="*"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" HorizontalAlignment="Center">Header1</TextBlock>
                <TextBlock Grid.Column="1" HorizontalAlignment="Center">Header2</TextBlock>
          </Grid>
     </DataTemplate>
 </DataGridTemplateColumn.HeaderTemplate>

但在这两种情况下我都有相同的错误结果。即。 Header1Header2放置了没有任何空格的Header1Header2。看起来Header1Header2HorizontalAligment =“左”相对整个标题。 即

列边框 - &gt; | Header1Header2 _ __ _ __ _ __ _ < / em> _ |&lt; - 列边框

因此Header1Header2不会放在DataGrid中相应的TextBlock上方。 我怎样才能解决我的问题?我该如何设置HeaderTemplate以获取我想要的内容?

1 个答案:

答案 0 :(得分:1)

自定义ControlTemplate会为您工作吗?

<DataGridTemplateColumn.HeaderStyle>
    <Style TargetType="{x:Type DataGridColumnHeader}">
        <Style.Setters>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"></ColumnDefinition>
                                <ColumnDefinition Width="*"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="0" HorizontalAlignment="Center">Header1</TextBlock>
                            <TextBlock Grid.Column="1" HorizontalAlignment="Center">Header2</TextBlock>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style.Setters>
    </Style>
</DataGridTemplateColumn.HeaderStyle>

您的另一个选择是创建自己的DataGridColumnHeadersPresenter,这将提示标题的可用大小。默认情况下,标题“ContentPresenters”不会被告知可用的大小,并会根据其内容(DataTemplate)计算宽度。

在您的情况下,未明确设置宽度(例如<Grid Width="200">),因此它只是TextBoxes的组合大小。