У меня была такая же проблема, и я понял ее после минимального теста и некоторых дедуктивных рассуждений!
В основном решение состоит в том, чтобы ВСЕГДА
убедитесь, что вы установили цвет фона (или любой другой стиль).
Не принимать значения по умолчанию для стиля строки . Я предполагал
по умолчанию белый - который является
разумное предположение, но на самом деле это не так.
Подробнее:
Похоже, что среда выполнения повторно использует экземпляры класса Row при рендеринге нескольких строк. Я вообще этого не проверял, но, судя по симптомам, это должно происходить.
У меня был только один или два ряда, которые должны быть окрашены по-разному. При прокрутке вверх и вниз я видел случайно окрашенные строки.
Вот мой тестовый класс, который я сделал. Каждый пятый ряд должен быть красным и курсивом.
Вы увидите закомментированную пару строк (которые устанавливают по умолчанию не курсив и белый фон). С этими комментариями - если вы прокрутите вверх и вниз, вы увидите много красного! Это потому, что объекты строк используются повторно. Если вы сделаете окно меньше, а затем увеличите его, часть белого вернется. Вероятно, сборщик мусора собирает строки, которые, как он думает, вам больше не понадобятся после уменьшения размера окна.
Как я уже говорил выше, решение состоит в том, чтобы всегда указывать стили для значений по умолчанию и не принимать никаких значений по умолчанию.
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; }
}
}