2012-07-11 83 views
6

我有我试图使像一个DataGrid: enter image description here如何使一个WPF的DataGrid交替行的颜色,并修复色彩节(忽略交替)

我使用的是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级别完成这一切。

谢谢!

回答

29

根据其他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> 
    
+0

不错,干净的答案!只需添加一些更多的细节:触发器的顺序在这里很重要。如果您将DataTrigger移动到顶端,那么它将首先触发,但随后将被AlernationIndex触发器之一覆盖。 – CptCoathanger 2016-10-11 09:58:36

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;