Форматирование таблицы данных WPF — соблюдаются не все стили

#c# #wpf #xaml

#c# #wpf #xaml

Вопрос:

Проблема

Используемые стили:

  • DataGridRow
  • DataGridCell

Я могу либо использовать выделение, либо заполнение ячеек, но не оба одновременно. Я пробовал много-много разных подходов (например, ресурсы и конкретные стили DataGrid), но ничего не работает и не допускает вопросов.

 <UserControl.Resources>
    <!-- DataGridRow style -->
    <Style x:Key="MyRowStyle" TargetType="{x:Type DataGridRow}">
        <Style.Resources>
            <SolidColorBrush 
              x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#E5BE47" />
            <SolidColorBrush 
              x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Blue" />
        </Style.Resources>
    </Style>
    <!-- DataGridCell style -->
    <Style x:Key="MyCellStyle" TargetType="{x:Type DataGridCell}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Border x:Name="border" Padding="15,10,10,15">
                        <ContentPresenter/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

<Grid>
    <!-- BOTH styles are used, which illustrates the problem: -->
    <DataGrid x:Name="Connections" AutoGenerateColumns="False" 
      RowStyle="{StaticResource MyRowStyle}" 
      CellStyle="{StaticResource MyCellStyle}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Process Id"/>
            <DataGridTextColumn Header="Name"/>
            <DataGridTextColumn Header="Application"/>
            <DataGridTextColumn Header="Directory" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
 

Передний план корректно изменится на «красный», но фон останется белым (а не желтым, как определено #E5BE47). Кажется, что HighlightBrushKey полностью игнорируется по какой-то причине, которую я не понимаю, когда DataGridCell также используется стиль.

Это проблема И, а не проблема ИЛИ. Как использовать оба стиля в DataGrid? Стили работают по отдельности. Проблема заключается в сочетании двух … оба не будут работать вместе — почему и как решить?

Вывод влево, желаемый вывод вправо:

введите описание изображения здесь

Если DataGridCell стиль удален, то цвет фона для выделения работает правильно… но это НЕ решение, поскольку оно удаляет желаемое заполнение.

Ответ №1:

Это работает

 <Style x:Key="MyRowStyle" TargetType="{x:Type DataGridRow}">
    <Style.Resources>             
         <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Blue" />
    </Style.Resources>
    <Style.Triggers>
       <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="#E5BE47 />
       </Trigger>
    </Style.Triggers>
</Style>
 

Комментарии:

1. Спасибо, что изучили это, но проблема остается: это комбинация выделения и заполнения ячеек. Когда используются оба стиля (как в моем демонстрационном коде), выделение игнорируется. Однако, если я удалю, CellStyle="{StaticResource MyCellStyle}" тогда выделение будет выполнено, но я не получу желаемого заполнения. Итак, существует некоторый конфликт между двумя стилями (DataGridCell и DataGridRow).

2. @ChEJunkie я отредактировал свой ответ. Я добавил триггер, он работает.

3. Спасибо @dmitriy! Для всех, кто сталкивается с этим вопросом, это выглядит как разумный ресурс для получения дополнительной информации о решении: tutorialspoint.com/xaml/xaml_triggers.htm