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; }
}
}
fonte
2010-01-17 02:48:42
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 –