Стиль DataGridColumnHeader со стилями в WPF - PullRequest
0 голосов
/ 23 апреля 2011

Привет, я пытаюсь реализовать способ фильтрации моих записей в 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.

Заранее спасибо!

1 Ответ

2 голосов
/ 23 апреля 2011

Если единственная причина, по которой вы не используете подход 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>
...