2012-04-07 13 views
6

Ich habe ein WPF-Datagrid, das mit einer ObservableCollection gefüllt ist.WPF-Datagrid-Zeilenfarbe ändern

Jetzt möchte ich die Zeilen je nach Zeileninhalt beim Programmstart farbig gestalten und wenn sich etwas zur Laufzeit ändert.

System.Windows.Controls.DataGrid areaDataGrid = ...; 
ObservableCollection<Area> areas; 
//adding items to areas collection 
areaDataGrid.ItemsSource = areas; 

areaDataGrid.Rows <-- Property not available. how to access rows here? 

CollectionView myCollectionView = (CollectionView)CollectionViewSource.GetDefaultView(areaDataGrid.Items); 
((INotifyCollectionChanged)myCollectionView).CollectionChanged += new NotifyCollectionChangedEventHandler(areaDataGrid_Changed); 
... 

void areaDataGrid_Changed(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    //how to access changed row here? 
} 

Wie kann ich auf die Zeilen bei Start und Laufzeit zugreifen?

Antwort

11

Verwenden Sie die RowStyle. Sie können das Triggers verwenden, um die Farbe bedingt zu ändern, oder Sie binden es einfach an eine Brush-Eigenschaft für Ihre Elemente und ändern diese Eigenschaft entsprechend.

5

Um es durch Code anstelle eines Triggers zu ändern, könnte es wie folgt aussehen. Sie können auf die Daten als Array zugreifen und sie dann vergleichen. In diesem Beispiel vergleiche ich die vierte Spalte, um zu sehen, ob sie größer als 0 ist, und die fünfte Spalte, um zu sehen, ob sie kleiner als 0 ist, ansonsten bemale sie einfach die Standardfarbe. Versuchen/fangen Sie es dort, weil irgendeine Logik hinzugefügt werden muss, um zu sehen, ob es eine gültige Reihe ist oder nicht ..... oder Sie können die Fehler gerade wie unten ignorieren (nicht wirklich gute Praxis) aber sollte verwendbar sein, wie ist .

private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     try 
     { 
      if (Convert.ToDouble(((System.Data.DataRowView)(e.Row.DataContext)).Row.ItemArray[3].ToString()) > 0) 
      { 
       e.Row.Background = new SolidColorBrush(Colors.Green); 
      } 
      else if (Convert.ToDouble(((System.Data.DataRowView)(e.Row.DataContext)).Row.ItemArray[4].ToString()) < 0) 
      { 
       e.Row.Background = new SolidColorBrush(Colors.Red); 
      } 
      else 
      { 
       e.Row.Background = new SolidColorBrush(Colors.WhiteSmoke); 
      } 
     } 
     catch 
     { 
     } 
    }