2009-10-02 16 views
7

Silverlightのデータグリッドの行の色はどのように変更しますか?C#Silverlight Datagrid - 行の色の変更

ランダム行が間違って色を取得...私はこれを試してみたが、私はそれがしたいどのように動作するようには思えない。

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); 
     } 
+0

私はこのコードを使用して、その可能性をランダム色を取得する行を考えていない - しかし、あなたは常に背景色を設定しない場合、それは可能である - これはあなたのために働く場合 –

答えて

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イベントを使用し、したがって、あること

を経験してきた行動を説明セット。

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); 
     } 
+0

下記の私の答えを参照してください、あなたは答えとしてそれを受け入れるべきです。 – kersny

+0

これはどのように修正されているのかわかりません。明確な問題が提示されない限り、この全体の問題を解決するソリューションは削除する必要があります。 – AnthonyWJones

+0

@Kersny 2日間は自分の答えを受け入れることはできません。 @AnthonyWJones、あなたのような人々は私を悩ます、育つ。 – Goober

5

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

基本的にソリューションを使用すると、背景色(または実際には任意のスタイル)を設定してください常に にあります。 行スタイリングのデフォルトを仮定しないでください。私は がデフォルトの白であると仮定していました - それは 合理的な仮定ですが、実際にはそうではありませんでした。

詳細:

複数の行をレンダリングするとき、ランタイムは行クラスのインスタンスを再利用するように見えます。私はこれを全く確認していないが、起こっているはずの症状から判断すると、

私は色を変えなければならない行は1つまたは2つしかありませんでした。私は上下にスクロールするときにランダムに色付きの行を見ていました。

私が作ったテストクラスです。 5行目は赤と斜体であると考えられています。

コメントアウトされた行がいくつか表示されます(デフォルトは斜体ではなく、白い背景に設定されています)。これらがコメントアウトされていると、上下にスクロールすると赤い部分が多く表示されます。これは、行オブジェクトが再利用されているためです。ウィンドウを小さくして最大化すると、白い部分が戻ってきます。おそらくガベージコレクタの行を収集すると、ウィンドウを小さくした後はもう必要ないと思われます。

私が上で述べたように、解決策は常にデフォルトのスタイルを指定することであり、デフォルトを想定しません。

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; } 
    } 
} 
0

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

また、行データに基づいて行の色を変更する必要がある場合は、データのスタイルをブラシに追加することができます。

彼らはReflectorを開き、System.Windows.Controls.Data.dllからDataGrid用のgeneric.xamlを取り出し、新しいxamlを書き換えて変更しました。

0

私のために働く。 =)

private void MyDataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     var row = e.Row.GetIndex(); 
     if (row % 2 == 0) 
     { 
      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; 
     } 
    } 
関連する問題