c #: Datagrid: изменение основного цвета выделения с помощью DataTriggers - PullRequest
0 голосов
/ 02 ноября 2019

Я хочу подсчитать цвета таблицы данных.

Мой код выглядит следующим образом

<Window x:Class="DataGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DataGridTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <DataGrid Grid.Row="1"
                  VerticalAlignment="Stretch" 
                  VerticalContentAlignment="Top"
                  GridLinesVisibility="Horizontal" 
                  VerticalScrollBarVisibility="Visible"
                  AutoGenerateColumns="True"
                  SelectionUnit="FullRow"
                      >

            <DataGrid.RowStyle>

                <Style TargetType="DataGridRow">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=Automatic}" Value="True">
                            <Setter Property="FontStyle" Value="Italic"/>
                            <Setter Property="Foreground"  Value="Green" />
                            <Setter Property="Background" Value="GhostWhite"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Path=Automatic}" Value="False">
                            <Setter Property="Background" Value="FloralWhite"/>
                            <Setter Property="Foreground"  Value="Blue" />
                        </DataTrigger>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Foreground"  Value="Black" /> <!-- Why is this ignored -->
                            <Setter Property="Background"  Value="Red" />
                        </Trigger>
                    </Style.Triggers>
                </Style >
            </DataGrid.RowStyle>

            <DataGrid.Columns>
                <DataGridTextColumn Header="Subject" Binding="{Binding Path=Subject}"/>
                <DataGridTextColumn Header="Body" Binding="{Binding Path=Body}"/>
                <DataGridTextColumn Header="Automatic" Binding="{Binding Path=Automatic}"/>
            </DataGrid.Columns>

            <local:Dummy Subject="Subject 1" Body="Body 1" Automatic="True" />
            <local:Dummy Subject="Subject 2" Body="Body 2" Automatic="False"  />
            <local:Dummy Subject="Subject 3" Body="Body 2"  Automatic="False" />
        </DataGrid>
    </Grid>
</Window>

и c #

using System.Windows;
namespace DataGridTest
{
    public class Dummy
    {
        public string Subject { get; set; }
        public string Body { get; set; }
        public bool Automatic { get; set; }
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {      
            InitializeComponent();
        }
    }
}

Результат выглядит как (Последняя строка выбрана):

enter image description here

Что я ожидал : вся последняя (выбранная) строка с черный шрифт на красном фоне.

Что я получил: Как видите, шрифт теперь белый , а фон частично красный / синий .

Интересно, что в первых двух строках сеттер определял цвета переднего плана, как и ожидалось. Даже если я деактивирую первые два установщика для переднего плана, выделенный текст в строке все еще остается белым.

Почему это так? Как определить желаемую расцветку для всего выделения?

1 Ответ

1 голос
/ 02 ноября 2019

Также следует добавить обработку IsSelected для DataGridCell (так же, как DataGridRow)

            <DataGrid.CellStyle>
                <Style TargetType="DataGridCell">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Foreground"  Value="Black" />
                            <Setter Property="Background"  Value="Red" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.CellStyle>
...