8

我有一个数据网格,我试图使其类似于: 在此处输入图像描述

我正在使用该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 级别做这一切。

谢谢!

4

2 回答 2

37

根据其他 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>
    
于 2012-07-11T16:39:49.973 回答
0

如果其他人也在寻找在代码中完成的相同事情:

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;
于 2018-02-21T16:05:54.337 回答