私はこれと同じ問題を抱えていて、最小限のテストといくつかの演繹的な推論を行った後、それを理解しました!
基本的に解決策は、常に
背景色 (または実際には任意のスタイル) を設定することです。
行のスタイリングのデフォルトを仮定しないでください。私はデフォルトの白を想定していました - これは妥当な想定ですが、実際にはそうではありませんでした。
詳細:
複数の行をレンダリングするときに、ランタイムが Row クラスのインスタンスを再利用しているようです。私はこれをまったく確認していませんが、症状から判断すると、それが起こっているに違いないようです.
別の色にする必要がある行は 1 つまたは 2 つしかありませんでした。上下にスクロールすると、ランダムに色付けされた行が表示されました。
ここに私が作った私のテストクラスがあります。5 行ごとに赤のイタリックにする必要があります。
コメント アウトされた 2 行が表示されます (これにより、デフォルトで斜体以外の白い背景が設定されます)。これらをコメントアウトすると、上下にスクロールすると、たくさんの赤が表示されます!! これは、行オブジェクトが再利用されているためです。ウィンドウを小さくしてから最大化すると、白の一部が戻ってきます。おそらく、ウィンドウを小さくした後は、ガベージコレクターが行を収集する必要はないと思われます。
上で述べたように、解決策は常にデフォルトのスタイルを指定し、デフォルトを想定しないことです。
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; }
}
}