2017-09-30 5 views
0

Ich verwende ein Datagrid und ändern Sie die Farbe der Zeilen entsprechend ihren Bedingungen, und ich führe dies programmgesteuert durch. folgen dem Beispiel als mein Datagrid an eine Datatable gebunden ist, habe ich die Informationen direkt aus der DatentabelleProbleme beim Ändern der DataGrid-Farbe mit WPF C#

private void UpdateCor() { 

gvDados.UpdateLayout(); 
for (int i = 0; i <dt.Rows.Count; i ++) 
{ 
     var rowContext = (DataGridRow) 
     gvDados.ItemContainerGenerator.ContainerFromIndex (i); 

      if (rowContext! = null) 
      { 
            if (dt.Rows [i] ["situation"]. ToString(). Equals (1)) 
                     rowContext.Background = Brushes.Green; 
            else 
                     rowContext.Background = Brushes.Red; 
      } 
    } 
} 

Damit lade ich die Farbe meiner Raster aktualisieren kann, auch wenn es nicht die beste Methode ist, angegangen werden. Mein Problem ist dies, wenn ich die Schriftrolle benutze, um die Leiste herunter oder hoch zu gehen, werden die Farben veraltet. Wie verhindere ich das? dass selbst wenn ich die Bar rolle, bleiben die Farben fest?

+1

Dies ist wegen der Virtualisierung. Was Sie versuchen, ist eine sehr schlechte Idee, wahrscheinlich unmöglich, die Arbeit richtig zu machen. Sie sollten dies in XAML mit einem Style und Triggern tun. Es gibt viele Beispiele für Stack Overflow. Aber suche mit Google; Die Suchfunktion hier ist nicht sehr gut. –

+0

Dieser Link: [datatrigger on enum um das Bild zu ändern] (https://stackoverflow.com/questions/13917033/datatrigger-on-enum-to-change-image) könnte Ihnen helfen. wahrscheinlich brauchen nur Setter zu Hintergrundfarbe –

Antwort

1

Dies ist eine ähnliche Frage zu this question. können mit Datatrigger erfolgen:

<DataGrid ItemsSource="{Binding YourItemsSource}"> 
     <DataGrid.RowStyle> 
      <Style TargetType="DataGridRow"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding State}" Value="State1"> 
         <Setter Property="Background" Value="Red"></Setter> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding State}" Value="State2"> 
         <Setter Property="Background" Value="Green"></Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </DataGrid.RowStyle> 
    </DataGrid> 
1

Oft XAML zu einfach ist komplizierter Bedingungen auszudrücken. Ich ziehe es vor, der Logik vorzugeben, welche Werte welche Farben in einen Konverter verwenden sollen. Dies führt zu einem einfacheren XAML und viel größerer Flexibilität für den Konverter in C#.

<datagrid.rowstyle> 
    <style targettype="DataGridRow"> 
    <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, 
     Path=Item.situation, Converter={StaticResource ValueToBackgroundConverter}}"/> 
    </style> 
</datagrid.rowstyle> 

In C#:

class ValueToBackgroundConverter: IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
    if (value is int) { 
     int quantity = (int)value; 
     if (quantity>=100) return Brushes.White; 
     if (quantity>=10) return Brushes.WhiteSmoke; 
     if (quantity>=0) return Brushes.LightGray; 
     return Brushes.White; //quantity should not be below 0 
    } 
    //value is not an integer. Do not throw an exception 
    // in the converter, but return something that is obviously wrong 
    return Brushes.Yellow; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
    throw new NotImplementedException(); 
    } 
} 

die verschiedenen Teile eines WPF Datagrid-Formatierung ist notorisch schwierig und Microsoft ist nicht die nötigen Informationen, wie es geht. Lesen Sie meinen Artikel Codeproject: Guide to WPF DataGrid formatting using binding, um ein besseres Verständnis dafür zu bekommen, wie man es leicht macht.

Verwandte Themen