我做了一个最小的测试和一些演绎推理之后,我也遇到了同样的问题,并想出了它。
基本上解决的办法是总是 确保你设置背景颜色(或事实上任何风格)。 不要假设行造型的任何默认设置。我假设 默认为白色 - 这是合理的假设,但实际上并非如此。
更多细节:
它看起来像运行时呈现多行的时候重用行类的实例。我根本没有证实这一点,但从看起来似乎必然会发生的症状来看。
我只有一行或两行应该有不同的颜色。滚动上下滚动时,我看到随机彩色的行。
这是我做的测试班。每五行应该是红色和斜体。
您会看到一条注释掉的行(它设置了非斜体和白色背景的默认值)。有了这些评论 - 如果你上下滚动,你会看到很多红色!这是因为行对象正在被重用。如果你让窗口变小然后最大化一些白色会回来。可能垃圾收集器收集行,它不认为你需要更多的窗口后,需要更多。
正如我上面所说的,解决方案是总是指定默认样式,不要假设任何默认值。
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; }
}
}
我不认为它可能得到随机有色行与此代码 - 但它是可能的,如果你不总是设置背景颜色 - 见下文 – 2010-01-17 03:05:06