Wpf 为什么模板化DataGridColumnHeader中会出现一个额外的列?
Hi有一个非常简单的WPF DataGrid布局,如下所示: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
<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中已修复。是的,我在发布后编辑了代码以删除该列,因为我认为这可能会混淆问题。这个问题不是由自动生成的列引起的,不管这些列是自动生成的还是非自动生成的,都会发生。不确定是谁对此投了赞成票,但尽管我很感激您的回答,但它与这个问题无关。:)