Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 为什么模板化DataGridColumnHeader中会出现一个额外的列?_Wpf_Xaml_Datagrid_Datagridcolumnheader - Fatal编程技术网

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

Wpf 为什么模板化DataGridColumnHeader中会出现一个额外的列?,wpf,xaml,datagrid,datagridcolumnheader,Wpf,Xaml,Datagrid,Datagridcolumnheader,Hi有一个非常简单的WPF DataGrid布局,如下所示: <wpftk:DataGrid Grid.Row="1" x:Name="myOrdersGrid" ColumnHeaderStyle="{DynamicResource FilterColumnHeaderStyle}" CanUserResizeColumns="True" VerticalAlignment="Stretch" Horizon

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

其目的是在每个标题中放置一个文本框,以充当过滤器

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

<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>
<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>


有人知道为什么吗?我玩过各种各样的设置等,但不知道为什么会发生这种情况(更不用说如何修复了……)。额外的文本框似乎没有启用/可单击,因此它看起来像是某种禁用/玻璃窗场景。

关闭
自动生成列。您有两个声明性列,加上要绑定到的数据项中的任何列-因此,如果您绑定到
列表
,那么您将得到第三列(正如您定义的
DataGridColumnHeader
模板一样,它也将用于第三列)


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

好的,因此我发现了问题。额外的控件似乎放在“filler”列中,datagrid会自动在最后定义的列和datagrid的RHS之间插入该列

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

<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>
<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中的额外列是否是一个bug(出于模板目的)-我读了一篇文章,指出它在.Net 4中已修复。

是的,我在发布后编辑了代码以删除该列,因为我认为这可能会混淆问题。这个问题不是由自动生成的列引起的,不管这些列是自动生成的还是非自动生成的,都会发生。不确定是谁对此投了赞成票,但尽管我很感激您的回答,但它与这个问题无关。:)