0

您好,有一个非常简单的 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

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

4

2 回答 2

1

关闭AutoGenerateColumns。您有两个声明性列,加上您要绑定的数据项中的任何列 - 因此,如果您绑定到 aList<string>那么您将获得第三列(并且由于您定义了DataGridColumnHeader模板,它将在第三列中使用列)。

(注意:您是否编辑过发布的代码以删除AutoGenerateColumns?我确定当我第一次查看时它就在那里)。

于 2012-09-24T12:01:44.273 回答
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 中显式声明它们。

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

于 2012-09-25T14:57:03.907 回答