2012-04-07 65 views
6

Tengo una cuadrícula de datos WPF que se llena con una ObserverableCollection.Cambiar fila de cuadrícula de datos WPF Color

Ahora quiero colorear las filas según el contenido de la fila al inicio del programa y si algo cambia durante el tiempo de ejecución.

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

¿Cómo puedo acceder a las filas al inicio y en el tiempo de ejecución?

Respuesta

11

Utilice RowStyle. Puede usar el Triggers para cambiar el color condicionalmente, o simplemente vincularlo a una propiedad Brush en sus artículos y cambiar esa propiedad, respectivamente.

5

Para cambiarlo a través del código en lugar de un disparador, podría verse más abajo. Puede acceder a los datos como una matriz y luego compararlos. En este ejemplo, estoy comparando la cuarta columna para ver si es mayor que 0 y la quinta columna para ver si es menor que 0, de lo contrario, simplemente pinte el color predeterminado. El try/catch it there necesita agregarse alguna lógica para ver si es una fila válida o no ... o simplemente puede ignorar los errores como se muestra a continuación (aunque no es una buena práctica), pero debería ser utilizable como lo es .

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