7

Silverlight データグリッドの行の色を変更するにはどうすればよいですか?!

私はこれを試しましたが、私が望むようには機能していないようです...ランダムな行が間違って色付けされます:

 void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            var c = e.Row.DataContext as Job;
            if (c != null && c.Status.Contains("complete"))
                e.Row.Background = new SolidColorBrush(Colors.Green);
            else
                e.Row.Background = new SolidColorBrush(Colors.Red);
        }
4

5 に答える 5

6

マイクロソフトのドキュメント:

パフォーマンスを向上させるために、EnableRowVirtualization プロパティはデフォルトで true に設定されています。EnableRowVirtualization プロパティが true に設定されている場合、DataGrid はバインドされたデータ ソース内の各データ項目に対して DataGridRow オブジェクトをインスタンス化しません。代わりに、DataGrid は必要な場合にのみ DataGridRow オブジェクトを作成し、可能な限り再利用します。たとえば、DataGrid は、現在表示されているデータ項目ごとに DataGridRow オブジェクトを作成し、スクロールして表示されなくなると行をリサイクルします。

ソース: http://msdn.microsoft.com/en-gb/library/system.windows.controls.datagrid.unloadingrow.aspx

これは、あなたが経験している行動を説明しています

したがって、UnloadingRow イベントを使用して、設定したスタイルを設定解除することが適切な (簡単ではありませんが) 解決策です。

于 2010-10-18T14:25:29.077 に答える
5

私はこれと同じ問題を抱えていて、最小限のテストといくつかの演繹的な推論を行った後、それを理解しました!

基本的に解決策は、常に 背景色 (または実際には任意のスタイル) を設定することです。 行のスタイリングのデフォルトを仮定しないでください。私はデフォルトの白を想定していました - これは妥当な想定ですが、実際にはそうではありませんでした。

詳細:

複数の行をレンダリングするときに、ランタイムが 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; }
    }
}
于 2010-01-17T02:48:42.637 に答える
3

私はこの後だった:

void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e)
        {
            DataGridRow row = e.Row;
            var c = row.DataContext as Job;         
            if (c != null && c.Status.Contains("omplete"))
                e.Row.Foreground = new SolidColorBrush(Colors.Green);
            else
                e.Row.Foreground = new SolidColorBrush(Colors.Red);
        }
于 2009-10-02T14:27:43.440 に答える
0

これを行う最善の方法は、DataGrid の RowStyle を変更することです。これには大量の xaml が必要ですが、ここからコピーして、いくつかのスタイルを変更するだけです。

また、行データに基づいて行の色を変更する必要がある場合は、Style のバインディングをデータの Brush プロパティに追加できます。

彼らは Reflector を開き、System.Windows.Controls.Data.dll から DataGrid の generic.xaml を取得し、それを変更するために新しい xaml を作成しました。

于 2011-03-23T19:36:22.383 に答える