2009-10-02 17 views
7

¿Cómo se cambia el color de las filas de la cuadrícula de datos de Silverlight?C# Silverlight Datagrid - Fila Color Change

He intentado esto pero no parece trabajar la forma en que yo quiero que ... filas aleatorios que de color erróneo:

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
     { 
      var c = e.Row.DataContext as Job; 
      if (c != null && c.Status.Contains("complete")) 
       e.Row.Background = new SolidColorBrush(Colors.Green); 
      else 
       e.Row.Background = new SolidColorBrush(Colors.Red); 
     } 
+0

no creo que sus posibles filas para conseguir colores al azar con este código - pero es posible si no siempre se establece un color de fondo - ver mi respuesta a continuación –

Respuesta

6

Microsoft Documentación:

Para mejorar el rendimiento, la propiedad es EnableRowVirtualization conjunto true de forma predeterminada. Cuando la propiedad EnableRowVirtualization es establecida en verdadero, DataGrid no instancia un objeto DataGridRow para cada elemento de datos en el origen de datos enlazado. En cambio, DataGrid crea objetos DataGridRow solo cuando son necesarios y los reutiliza tanto como . Por ejemplo, DataGrid crea un objeto DataGridRow para cada elemento de datos que está actualmente a la vista y recicla la fila cuando se desplaza a la vista .

fuente: http://msdn.microsoft.com/en-gb/library/system.windows.controls.datagrid.unloadingrow.aspx

esto explica por el comportamiento que ha estado experimentando

el correcto (aunque no más fácil que admitir) ser una solución, por lo tanto, utilizar el evento UnloadingRow a desarmar el estilo que tenía conjunto.

3

que fue después de esto:

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
     { 
      DataGridRow row = e.Row; 
      var c = row.DataContext as Job;   
      if (c != null && c.Status.Contains("omplete")) 
       e.Row.Foreground = new SolidColorBrush(Colors.Green); 
      else 
       e.Row.Foreground = new SolidColorBrush(Colors.Red); 
     } 
+0

Si esto funciona para usted, deberías aceptarlo como la respuesta. – kersny

+0

No veo cómo esto arregla las cosas. A menos que se pueda presentar un problema claro, la solución dada a esta pregunta debe ser eliminada. – AnthonyWJones

+0

@Kersny No puede aceptar su propia respuesta durante 2 días. @AnthonyWJones, la gente como tú me molesta, crece. – Goober

5

Tuve este mismo problema y lo resolví después de hacer una prueba mínima y un poco de razonamiento deductivo.

Básicamente, la solución es SIEMPRE asegúrese de configurar el color de fondo (o cualquier estilo, de hecho). No asuma ningún valor predeterminado para el diseño de filas. Estaba asumiendo un valor por defecto de blanco, que es una suposición razonable pero en realidad no fue el caso.

Más detalles:

Parece que el tiempo de ejecución reutiliza instancias de la clase Fila cuando la prestación de múltiples filas. No he verificado esto en absoluto, pero a juzgar por los síntomas, parece que eso debe estar sucediendo.

Tenía solo una o dos filas que deberían colorearse de forma diferente. Estaba viendo filas coloreadas al azar cuando me desplazo hacia arriba y hacia abajo.

Aquí está mi clase de prueba que hice. Se supone que cada quinta fila es roja y cursiva.

Verá un par de líneas comentadas (que establecen un fondo predeterminado que no es en cursiva y en blanco). Con estos comentarios, si te desplazas hacia arriba y hacia abajo verás un montón de rojo. Esto se debe a que los objetos de la fila se están reutilizando. Si reduce la ventana y luego la maximiza, parte del blanco volverá. Probablemente el recolector de basura recolecte las filas; no cree que necesite más después de haber reducido la ventana.

Como dije anteriormente, la solución es especificar siempre los estilos para los valores predeterminados y no asumir ningún valor predeterminado.

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     dataGrid1.ItemsSource = Enumerable.Range(0, 50).Select(x => new Person() 
     { 
      FirstName = "John", 
      LastName = "Smith", 
      ID = x, 
      Delinquent = (x % 5 == 0)  // every fifth person is 'delinquent' 
     }); 
    } 

    private void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     var person = (Person)e.Row.DataContext; 

     if (person.Delinquent) 
     { 
      e.Row.Background = new SolidColorBrush(Colors.Red); 
      e.Row.Foreground = new SolidColorBrush(Colors.White); 
      e.Row.FontStyle = FontStyles.Italic; 
     } 

     else 
     { 
      // defaults - without these you'll get randomly colored rows 
      // e.Row.Background = new SolidColorBrush(Colors.Green); 
      // e.Row.Foreground = new SolidColorBrush(Colors.Black); 
      // e.Row.FontStyle = FontStyles.Normal; 
     } 

    } 

    public class Person 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public int ID { get; set; } 
     public bool Delinquent { get; set; } 
    } 
} 
0

La mejor manera de hacerlo es cambiar RowStyle en su DataGrid. Esto requiere una gran cantidad de xaml, pero puede copiarlo desde here y cambiar algunos estilos.

Además, si necesita cambiar el color de la fila según los datos de la fila, puede agregar un enlace en la propiedad Estilo a un Pincel en sus datos.

Abrieron Reflector y tomaron generic.xaml para el DataGrid de System.Windows.Controls.Data.dll, y luego escribieron un nuevo xaml para cambiarlo.

0

Funciona para mí. =)

private void MyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     var row = e.Row.GetIndex(); 
     if (row % 2 == 0) 
     { 
      e.Row.Background = new SolidColorBrush(Colors.Red); 
      e.Row.Foreground = new SolidColorBrush(Colors.White); 
      e.Row.FontStyle = FontStyles.Italic; 
     } 

     else 
     { 
      // defaults - without these you'll get randomly colored rows 
      e.Row.Background = new SolidColorBrush(Colors.Green); 
      e.Row.Foreground = new SolidColorBrush(Colors.Black); 
      e.Row.FontStyle = FontStyles.Normal; 
     } 
    } 
Cuestiones relacionadas