2009-10-02 15 views
7

Come si modifica il colore delle righe datagrid Silverlight ?!C# Silverlight Datagrid - Modifica colore riga

Ho provato questo, ma non sembra funzionare come voglio che ... le righe casuali ottenere colorato in modo non corretto:

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

non credo che i suoi possibili righe da ottenere colorate in modo casuale con questo codice - ma è possibile se non sempre impostare un colore di sfondo - vedere la mia risposta qui sotto –

risposta

6

Microsoft Documentazione:

Per migliorare le prestazioni, la proprietà è EnableRowVirtualization impostato su true per impostazione predefinita. Quando la proprietà EnableRowVirtualization è impostata su true, DataGrid non crea un'istanza di un oggetto DataGridRow per ogni elemento di dati nell'origine dati associata. Invece, DataGrid crea oggetti DataGridRow solo quando sono necessari, e li riutilizza tanto quanto può fare il can. Ad esempio, DataGrid crea un oggetto DataGridRow per ogni elemento di dati attualmente visualizzato e ricicla la riga quando scorre fuori dalla vista .

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

questo spiega il comportamento che hanno sperimentato

il corretto (anche se non più facile lo ammetto) soluzione di essere, di conseguenza, per utilizzare l'evento UnloadingRow per rimuovere lo stile si doveva impostato.

3

mi è stato dopo questo:

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

Se questo funziona per voi, dovresti accettarlo come risposta. – kersny

+0

Non vedo come questo risolva le cose. A meno che non si possa presentare un problema chiaro, la soluzione data questa intera domanda dovrebbe essere cancellata. – AnthonyWJones

+0

@Kersny Non è possibile accettare la propria risposta per 2 giorni. @AnthonyWJones, le persone come te mi infastidiscono, crescono. – Goober

5

Ho avuto questo stesso problema e l'ho capito dopo aver effettuato un test minimo e qualche ragionamento deduttivo!

Fondamentalmente la soluzione è quella di SEMPRE assicurarsi di impostare il colore di sfondo (o qualsiasi stile di fatto). Non assumere alcun valore di default per lo stile di riga. Stavo assumendo un bianco di default - che è una supposizione ragionevole ma in realtà non era il caso.

Maggiori dettagli:

Sembra che il runtime riutilizza le istanze della classe Row quando il rendering più righe. Non l'ho ancora verificato, ma a giudicare dai sintomi sembra che debba accadere.

Ho avuto solo una o due righe che dovrebbero essere colorate in modo diverso. Stavo vedendo righe colorate casualmente quando si scorre su e giù.

Ecco il mio test di classe che ho fatto. Ogni quinta riga dovrebbe essere rossa e corsiva.

Vedrete un paio di righe commentate (che impostano un valore predefinito di sfondo non-corsivo e bianco). Con questi commentati - se scorri su e giù vedrai molto rosso !! Questo perché gli oggetti riga vengono riutilizzati. Se si riduce la finestra e si ingrandisce, parte del bianco tornerà indietro. Probabilmente spazzatura che raccoglie file non pensa che ti servirà più dopo aver ridotto la finestra.

Come ho detto sopra, la soluzione è di specificare sempre gli stili per i valori predefiniti e non assumere alcun valore predefinito.

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

Il modo migliore per farlo è modificare il RowStyle sul tuo DataGrid. Ciò richiede un sacco di xaml, ma puoi semplicemente copiarlo da here e cambiarne alcuni stili.

Inoltre, se è necessario modificare il colore della riga in base ai dati della riga, è possibile aggiungere un'associazione nella proprietà Stile a un pennello sui dati.

Hanno aperto Reflector e hanno preso generic.xaml per DataGrid da System.Windows.Controls.Data.dll, quindi hanno scritto del nuovo xaml per cambiarlo.

0

Funziona per me. =)

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; 
     } 
    } 
Problemi correlati