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

发布于 2024-11-03 02:48:22 字数 819 浏览 0 评论 0原文

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

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

如果我像这样在 DataGridColumn 中应用样式:

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

它将完美地工作!

但是,如果尝试将其放入样式中,我会这样做:

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

通过使用 ControlTemplate,我们将覆盖背景和 DataGridColumnHeader 的所有默认布局,但我不希望这样。我怎样才能做到这一点?

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

提前致谢!

Hi i am trying to implement a way to filter my records in a DataGrid. My idea is to put TextBoxes in the Header of each Column.

I am doing this depending if a ToggleButton is pressed or not, but i am having a problem in the way that i am applying the style in the Header.

If i apply the style inside the DataGridColumn like this:

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

It will work perfectly!

But if try to put this in a Style i am doing it like this:

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

By using the ControlTemplate we will override the background and all the Default layout of DataGridColumnHeader and i don't want that. How i can i do this?

I am really tring to do this to avoid repeat code in XAML.

Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

假情假意假温柔 2024-11-10 02:48:22

如果您使用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>

If the only reason you are not using the DataTemplate approach is because you want to define it once (at some central location) and then use it at multiple places (e.g. multiple columns), you can move that DataTemplate to the resources section, assign it a resource key and use it whereever you want.



Here's how:

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文