DataGrid RowStyle не работает для комбинации IsSelected и IsMouseOver - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть простая DatGrid. Я хочу установить цвет фона моих строк в соответствии с указанными c критериями. В этом примере строка в начале просто красная.

Я хочу изменить этот базовый c цвет фона на другие цвета

  • , когда мышь наводится на строку
  • при выборе строки
  • при выборе строки и наведении на нее указателя мыши

Дело в том, что она работает для ячеек, но не для всей строки ,

Я установил MultiTrigger для последнего требования, и это меняет цвет ячейки, но не цвет всей строки. Когда я перемещаю CellStyle MultiTrigger в RowStyle, он больше ничего не делает.

screenshot

<Window x:Class="MyWindow"
        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:WpfTest" >
    <Window.DataContext>
        <local:MyWindowViewModel />
    </Window.DataContext>
    <Grid>
        <DataGrid ItemsSource="{Binding Items}"
                  AutoGenerateColumns="False" 
                  SelectionMode="Single" SelectionUnit="FullRow" >    
            <DataGrid.RowStyle>
                <Style TargetType="DataGridRow">
                    <Setter Property="Background" Value="Red"/>

                    <Style.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="Background" Value="Green" />
                        </Trigger>                                                  
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>

            <DataGrid.CellStyle>
                <Style TargetType="DataGridCell">
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="Background" Value="Orange" />
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="True" />
                                <Condition Property="IsMouseOver" Value="True" />
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" Value="Yellow"/>
                        </MultiTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.CellStyle>

            <DataGrid.Columns>
                <DataGridTextColumn Header="FirstName"  Width="50*" Binding="{Binding FirstName}" />
                <DataGridTextColumn Header="LastName"  Width="50*" Binding="{Binding LastName}" />
            </DataGrid.Columns>            
        </DataGrid>
    </Grid>
</Window>

Model / ViewModel:

class Model
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

class MyWindowViewModel
{
    public List<Model> Items { get; private set; }

    public MyWindowViewModel()
    {
        Items = new List<Model>();
        Items.Add(new Model { FirstName = "AB", LastName = "CD"});
        Items.Add(new Model { FirstName = "EF", LastName = "GH" });
        Items.Add(new Model { FirstName = "IJ", LastName = "KL" });
    }
}

1 Ответ

2 голосов
/ 13 февраля 2020

Вам нужен DataTrigger в вашем стиле DataGridCell, который будет привязан к родительским строкам IsSelected, чтобы все ячейки меняли стиль, а не только тот, который вы зависаете.

<DataTrigger Binding="{Binding Path=IsMouseOver, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}" Value="True">
    <Setter Property="Background" Value="Yellow"/>
</DataTrigger>
...