J'ai eu ce même problème et je l'ai compris après avoir fait un test minimal et un raisonnement déductif!
Fondamentalement, la solution est de TOUJOURS assurez-vous de définir la couleur d'arrière-plan (ou tout style en fait). N'assumez aucune valeur par défaut pour le style de ligne. Je supposais un défaut de blanc - ce qui est une hypothèse raisonnable mais n'était pas réellement le cas.
Plus de détails:
Il semble que le temps d'exécution réutilise instances de la classe de ligne lors du rendu plusieurs lignes. Je n'ai pas vérifié cela du tout, mais à en juger par les symptômes, il semble que cela doive se produire.
Je n'avais qu'une ou deux lignes qui devaient être colorées différemment. Je voyais des lignes colorées au hasard en faisant défiler de haut en bas.
Voici ma classe de test que j'ai faite. Chaque cinquième rangée est censée être rouge et italique.
Vous verrez quelques lignes commentées (qui définissent un arrière-plan non-italique et blanc par défaut). Avec ceux-ci commenté - si vous faites défiler de haut en bas, vous verrez beaucoup de rouge !! C'est parce que les objets de la ligne sont en train d'être réutilisés. Si vous réduisez la fenêtre et que vous la maximisez, une partie du blanc reviendra. Probablement garbage collector ramassant des rangs il ne pense pas que vous aurez besoin de plus après avoir fait la fenêtre plus petite.
Comme je l'ai dit ci-dessus, la solution consiste à toujours spécifier des styles pour les valeurs par défaut et ne pas assumer les valeurs par défaut.
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; }
}
}
je ne pense pas que ses possible d'obtenir des lignes de couleur au hasard avec ce code - mais il est possible que si vous ne définissez pas toujours une couleur de fond - voir ma réponse ci-dessous –