2012-04-07 7 views
6

Ho un datagrid WPF che è pieno di ObserverableCollection.Modifica WPF Datagrid Row Colore

Ora voglio colorare le righe a seconda del contenuto della riga all'avvio del programma e se qualcosa cambia durante il runtime.

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

Come accedere alle righe all'avvio e al runtime?

risposta

11

Utilizzare RowStyle. È possibile utilizzare Triggers per modificare il colore in modo condizionale o semplicemente associarlo a una proprietà Brush sugli elementi e modificare la proprietà rispettivamente.

5

Per cambiarlo tramite codice anziché un trigger, potrebbe apparire qualcosa di simile in basso. È possibile accedere ai dati come matrice e confrontarli. In questo esempio sto confrontando la quarta colonna per vedere se è maggiore di 0 e la quinta colonna per vedere se è inferiore a 0 altrimenti dipingi solo il colore predefinito. Il try/catch it perché una logica deve essere aggiunto per vedere se è una riga valida o no ..... o si può semplicemente ignorare gli errori come di seguito (non è una buona pratica però), ma dovrebbe essere utilizzabile come è .

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