我做了一個最小的測試和一些演繹推理之後,我也遇到了同樣的問題,並想出了它。
基本上解決的辦法是總是 確保你設置背景顏色(或事實上任何風格)。 不要假設行造型的任何默認設置。我假設 默認爲白色 - 這是合理的假設,但實際上並非如此。
更多細節:
它看起來像運行時呈現多行的時候重用行類的實例。我根本沒有證實這一點,但從看起來似乎必然會發生的症狀來看。
我只有一行或兩行應該有不同的顏色。滾動上下滾動時,我看到隨機彩色的行。
這是我做的測試班。每五行應該是紅色和斜體。
您會看到一條註釋掉的行(它設置了非斜體和白色背景的默認值)。有了這些評論 - 如果你上下滾動,你會看到很多紅色!這是因爲行對象正在被重用。如果你讓窗口變小然後最大化一些白色會回來。可能垃圾收集器收集行,它不認爲你需要更多的窗口後,需要更多。
正如我上面所說的,解決方案是總是指定默認樣式,不要假設任何默認值。
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