我遇到了同样的问题,并在进行了最小的测试和一些演绎推理后解决了这个问题!
基本上解决方案是始终
确保设置背景颜色(或实际上的任何样式)。
不要假设行样式有任何默认值。我假设默认为白色 - 这是一个合理的假设,但实际上并非如此。
更多细节:
看起来运行时在呈现多行时重用了 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; }
}
}