Как сделать WPF DataGrid с чередующимися цветами строк и разделом fix color (игнорируя чередование)

у меня есть datagrid, который я пытаюсь сделать похожим: enter image description here

Я использую AlternatingRowBackground атрибут для выполнения чередующихся цветов. Для раздела фиксированного цвета у меня есть XAML, который напоминает:

            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridRow}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=ShouldBeFixedColor}" Value="True">
                            <DataTrigger.Setters>
                                <Setter Property="Background" Value="Blue" />
                            </DataTrigger.Setters>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.Resources>

проблема с этим подходом заключается в том, что" переменный цвет " имеет приоритет над триггером фиксированного цвета. Так, внизу вместо сине-сине-голубого оно сине-серо-голубое.

есть идеи о том, как архивировать нужную раскраску? Я бы скорее сделайте все это на уровне XAML, если это возможно.

спасибо!

2 ответов


сделал некоторые изменения, основанные на других ответах SO. Надеюсь, это поможет кому-то в будущем.

  1. Янк AlternatingRowBackground=... из сетки. Добавить AlternationCount="2"
  2. добавьте блок ниже, чтобы сделать стиль (вручную делая чередующиеся строки)

            <DataGrid.RowStyle>
                <Style TargetType="{x:Type DataGridRow}">
                    <Style.Triggers>
                        <Trigger Property="AlternationIndex" Value="0">
                            <Setter Property="Background" Value="White" />
                        </Trigger>
                        <Trigger Property="AlternationIndex" Value="1">
                            <Setter Property="Background" Value="WhiteSmoke" />
                        </Trigger>
                        <DataTrigger Binding="{Binding Path=Selectable}" Value="False">
                            <DataTrigger.Setters>
                                <Setter Property="Background" Value="LightGray" />
                            </DataTrigger.Setters>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.RowStyle>
    

в случае если кто-то еще ищет то же самое сделать в коде:

Style rowStyle = new Style(typeof(DataGridRow));

Trigger rowTrigger = new Trigger();
rowTrigger.Property = DataGridRow.AlternationIndexProperty;
rowTrigger.Value = 0;

Setter rowSetter = new Setter(DataGridRow.BackgroundProperty, Brushes.Yellow);
rowTrigger.Setters.Add(rowSetter);

Trigger alternateRowTrigger = new Trigger();
alternateRowTrigger.Property = DataGridRow.AlternationIndexProperty;
alternateRowTrigger.Value = 1;

Setter alternateRowSetter = new Setter(DataGridRow.BackgroundProperty, Brushes.Pink);
alternateRowTrigger.Setters.Add(alternateRowSetter);

DataTrigger rowDataTrigger = new DataTrigger();
rowDataTrigger.Value = true;
rowDataTrigger.Binding = new Binding() { Path = new PropertyPath(nameof(MyObject.IsSomethingTrue))};

Setter backgroundSetter = new Setter(DataGridRow.BackgroundProperty, Brushes.Blue);
Setter foregroundSetter = new Setter(DataGridRow.ForegroundProperty, Brushes.White);
rowDataTrigger.Setters.Add(backgroundSetter);
rowDataTrigger.Setters.Add(foregroundSetter);

// the order of the triggers may not be changed as explained by CptCoathanger
rowStyle.Triggers.Add(rowTrigger);
rowStyle.Triggers.Add(alternateRowTrigger);
rowStyle.Triggers.Add(rowDataTrigger);            

RootDataGridOrders.RowStyle = rowStyle;