Специальный стиль сетки только для одного столбца

Как установить собственный стиль линии сетки только для одного столбца Сетка данных? В частности, я хотел бы, чтобы один столбец имел двойную линию в качестве левой границы.

Пример:

| Col1 | Col2 || Col3 (w/ Double Left Border) |

Спасибо,
Бен


person Ben Gribaudo    schedule 19.01.2011    source источник


Ответы (2)


Это зависит от того, где вы хотите эту двойную линию. Вертикальные GridLines рисуются в OnRender для DataGridCell, а горизонтальные GridLines рисуются в OnRender для DataGridCellsPresenter. Однако граница для DataGridColumnHeader более сложная. Это прямоугольник, нарисованный методом RenderTheme в DataGridHeaderBorder, и я не думаю, что есть прямой способ изменить его ширину без повторного создания шаблона всего DataGridColumnHeader. Кроме того, толщина границы для заголовков в два раза больше толщины ячеек в DataGrid для начала (1 пиксель против 2 пикселей), потому что заголовки рисуют свои разделители с обеих сторон.

Итак, чтобы получить двойную толщину линии, которая влияет только на ячейки, вы можете добавить специальный стиль DataGridCell, где вы хотите применить это. Все, что делает этот стиль ячейки, — рисует границу в 1 пиксель слева того же цвета, что и GridLines. Это будет выглядеть примерно так

альтернативный текст

<DataGrid ...
          HorizontalGridLinesBrush="Black">
    <DataGrid.Resources>
        <Style x:Key="DoubleLeftBorderCell" TargetType="DataGridCell">
            <Setter Property="BorderThickness" Value="1,0,0,0"/>
            <Setter Property="BorderBrush" Value="{Binding ElementName=dataGrid, Path=HorizontalGridLinesBrush}"/>
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Double left Border"
                            CellStyle="{StaticResource DoubleLeftBorderCell}"
                            Binding="{Binding TextProperty}"/>
    </DataGrid.Columns>
</DataGrid>

В ячейках нет эффекта наведения мыши или чего-то еще, о чем нужно беспокоиться. Однако, если вы сделаете что-то подобное для DataGridColumnHeader, вы потеряете стрелки сортировки, эффект наведения мыши, эффект наведения мыши и т. д., поэтому вам придется создать для него целый шаблон.

person Fredrik Hedblad    schedule 19.01.2011

Вот что я в итоге сделал:

<DataGridTextColumn Header="Header Name">
    <DataGridTextColumn.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Setter Property="Margin" Value="1 0 0 0" />
            <Setter Property="BorderThickness" Value="1 0 0 0" />
            <Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=HorizontalGridLinesBrush}" />
        </Style>
    </DataGridTextColumn.CellStyle>
</DataGridTextColumn>

Это основано на ответе Мелеака, но с добавлением поля (для создания эффекта двойной линии) и использованием RelativeSource для кисти границы, что устраняет необходимость в том, чтобы DataGrid имел x: Name.

person Ben Gribaudo    schedule 20.01.2011