繁体   English   中英

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

[英]Why is an extra column appearing in templated 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

有人知道为什么吗? 我已经进行过各种设置等工作,但无法弄清楚为什么会发生这种情况(更不用说如何解决它了……)。 多余的文本框似乎未启用/可单击,因此看起来像是某种禁用/眼镜擦的情况。

关闭AutoGenerateColumns 您有两个声明性列,以及要绑定到的数据项中的任何列-因此,如果要绑定到List<string> ,则将获得第三列(并且在定义DataGridColumnHeader模板时,它将也可以在第三列中使用)。

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

好的,所以我找到了问题。 额外的控件似乎被放置在datagrid自动在最后定义的列与datagrid的RHS之间插入的“ filler”列中。

更好的方法是将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中明确声明它们。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM