2012-07-11 33 views
6

Tengo una cuadrícula de datos que estoy tratando de hacer que se parece: enter image description hereComo hacer un WPF DataGrid con la alternancia de colores de las filas, y un (ignorando la alternancia) sección del color del arreglo

estoy usando el atributo de AlternatingRowBackground realizar los colores alternativos. Para la sección de color fijo, tengo XAML que se asemeja:

  <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> 

El problema con este enfoque es que el "color alterna" tiene prioridad sobre el gatillo estilo de color fijo. Por lo tanto, en la parte inferior en lugar de azul azul-azul, es azul-gris-azul.

¿Alguna idea sobre cómo archivar la coloración deseada? Prefiero hacer esto todo en el nivel XAML si es posible.

Gracias!

Respuesta

29

Realizó algunos cambios en función de otras respuestas de SO. Espero que esto ayude a alguien en el futuro.

  1. Yank AlternatingRowBackground=... de la red. Añadir AlternationCount="2"
  2. Agregar el bloque de abajo para hacer el estilo (haciendo manualmente las filas alternas)

     <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

¡Respuesta bonita y limpia! Solo para agregar más detalles: el orden de los Disparadores es importante aquí. Si moviera el DataTrigger a la parte superior, se dispararía primero pero luego sería sobrescrito por uno de los activadores de AlernationIndex. – CptCoathanger

0

En caso de que otra persona también está buscando lo mismo hecho en código:

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; 
Cuestiones relacionadas