在WPF中使用样式设置DataGridColumnHeader样式

时间:2011-04-22 22:06:49

标签: wpf xaml styles resourcedictionary

您好我正在尝试实现一种在DataGrid中过滤我的记录的方法。我的想法是将TextBoxes放在每列的标题中。

我这样做取决于是否按下了ToggleButton,但是我在标题中应用样式的方式存在问题。

如果我在DataGridColumn中应用样式,如下所示:

<DataGridTextColumn>
    <DataGridTextColumn.HeaderTemplate>
        <DataTemplate>
            (...)
        </DataTemplate>
    </DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>

它会完美运作!

但如果尝试将其放入Style中,我就是这样做的:

<Style TargetType="{x:Type DataGridTextColumn}">
    <Setter Property="Template">
        <ControlTemplate>
            (...)
        </ControlTemplate>
    </Setter>
</Style>

通过使用ControlTemplate,我们将覆盖背景和DataGridColumnHeader的所有Default布局,我不希望这样。我怎么能这样做?

我真的想要这样做以避免在XAML中重复代码。

提前致谢!

1 个答案:

答案 0 :(得分:2)

如果你使用DataTemplate方法的唯一原因是你想要定义一次(在某个中心位置)然后在多个地方(例如多列)使用它,你可以将DataTemplate移动到资源部分,为其分配资源键并随时使用它。

方法如下:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="300" Loaded="Window_Loaded">
    <Window.Resources>
        <DataTemplate x:Key="MySpecialHeaderTemplate">
            <TextBox Text="Search..." />
        </DataTemplate>
    </Window.Resources>
    <Grid>
        <DataGrid>
            <DataGrid.Columns>
                <DataGridTextColumn
                        Binding="{Binding Id}" />
                <DataGridTextColumn HeaderTemplate="{StaticResource MySpecialHeaderTemplate}"
                        Binding="{Binding Name}" />
                <DataGridTextColumn HeaderTemplate="{StaticResource MySpecialHeaderTemplate}"
                        Binding="{Binding Age}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>