2012-07-11 6 views
6

Mam datagrid, który próbuję dokonać przypominają: enter image description hereJak dokonać WPF DataGrid z naprzemiennych kolorów wierszy, a sekcja kolor fix (pomijając naprzemienne)

Używam atrybut AlternatingRowBackground wykonaj zmienne kolory. Dla sekcji stałej koloru, mam XAML podobny:

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

Problem z tego podejścia jest to, że „na przemian kolor” ma pierwszeństwo przed ustalonym KOLOR spuście. Tak więc na dole zamiast niebiesko-niebiesko-niebieskiego jest niebiesko-szaro-niebieski.

Jakieś pomysły na archiwizację żądanej kolorystyki? Wolałbym zrobić to wszystko na poziomie XAML, jeśli to możliwe.

Dzięki!

Odpowiedz

29

Wprowadzono kilka zmian w oparciu o inne odpowiedzi SO. Mam nadzieję, że to pomoże komuś w przyszłości.

  1. Yank AlternatingRowBackground=... z sieci. Dodaj AlternationCount="2"
  2. dodać blok poniżej zrobić stylizację (ręcznie robi naprzemiennymi rzędami)

     <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

Ładna, czysta odpowiedź! Aby dodać więcej szczegółów: kolejność wyzwalaczy jest tutaj ważna. Jeśli przeniesiesz DataTrigger na szczyt, to najpierw zostanie uruchomiony, ale później zostanie nadpisany przez jeden z wyzwalaczy AlernationIndex. – CptCoathanger

0

W przypadku gdy ktoś inny jest również poszukuje tego samego zrobić w kodzie:

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;