为什么在模板化的DataGridColumnHeader中会出现一个额外的列?

时间:2012-09-24 11:55:10

标签: wpf xaml datagrid datagridcolumnheader

您有一个非常简单的WPF DataGrid布局如下:

<wpftk:DataGrid Grid.Row="1"
        x:Name="myOrdersGrid"
        ColumnHeaderStyle="{DynamicResource FilterColumnHeaderStyle}"
        CanUserResizeColumns="True"
        VerticalAlignment="Stretch"
        HorizontalAlignment="Stretch">

  <wpftk:DataGrid.Resources>
    <Style x:Key="FilterColumnHeaderStyle" TargetType="{x:Type Primitives:DataGridColumnHeader}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type Primitives:DataGridColumnHeader}">
            <WrapPanel Width="50" Orientation="Vertical">
              <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Stretch"  />
              <TextBox Text="Hello" FontSize="10" Background="OldLace" HorizontalAlignment="Center" />
            </WrapPanel >
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </wpftk:DataGrid.Resources>

  <wpftk:DataGrid.Columns>
    <wpftk:DataGridTextColumn SortMemberPath="Name" Binding="{Binding Name}" IsReadOnly="True"/>
    <wpftk:DataGridTextColumn SortMemberPath="Name" Binding="{Binding Price}" IsReadOnly="True"/>
  </wpftk:DataGrid.Columns>
</wpftk:DataGrid>

目的是将文本框放入每个标题中,以充当过滤器。

但是,当渲染时,我会在数据网格中间浮动一个额外的文本框,如下所示:

DataGrid with extra column

任何人都知道为什么?我玩各种各样的设置等,但无法弄清楚为什么会发生这种情况(更不用说如何解决它了....)。额外的文本框似乎没有启用/可点击,所以它看起来像是某种禁用/玻璃窗格的场景。

2 个答案:

答案 0 :(得分:1)

关闭AutoGenerateColumns。您有两个声明性列,以及您绑定到的数据项中的任何列 - 因此,如果您绑定到List<string>,那么您将获得第三列(并且您已经定义了{ {1}}模板也将在第三列上使用)。

(注意:您是否已修改已发布的代码以删除DataGridColumnHeader?我确定在我第一眼看时它就在那里。)

答案 1 :(得分:0)

好的,所以我发现了这个问题。额外控件似乎放在“填充”列中,数据网格自动在最后定义的列和数据网格的RHS之间插入。

更好的方法是使用ContentTemplate作为标题控件,如下所示:

<Style x:Key="FilterColumnHeaderStyle" TargetType="{x:Type Primitives:DataGridColumnHeader}">
      <Setter Property="ContentTemplate">
        <Setter.Value>
          <DataTemplate>
            <WrapPanel Orientation="Vertical">
              <ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="Stretch"  />
              <TextBox Text="{grid:GridFilter UpdateSourceTrigger=PropertyChanged}"
                  Visibility="{Binding ElementName=FilterCheckbox, Path=IsChecked, Converter={StaticResource b2v}}"
                  FontSize="10" Width="50" Background="OldLace" HorizontalAlignment="Center" />
            </WrapPanel >
          </DataTemplate>
        </Setter.Value>
      </Setter>
    </Style>

这意味着自定义标题从网格中保留了正确的样式,并且包含了拇指等,而无需在XAML中明确声明它们。

仍然有兴趣知道数据网格中的额外列是否是一个bug(出于模板目的) - 我读了一篇文章,表明它已在.Net 4中修复。