2012-02-24 16 views
0

私は、DataSetを介してデータベースからデータを取り込むDataGridを持っています。さて、私がしなければならないことは、細胞の価値と多くの他の要因に基づいて、細胞の背景を色づけることです。IValueConverter WPF DataGridCellの問題

2日間でインターネットを精査した後、私はIValueConverterを使ってこれを実行することに決めました。私のコードを書いた後、コードは正常に実行されます。私はテストして、1)IValueConverterクラスが呼び出されていることと、2)実際にブラシカラーを返すことを見てきました。

私の問題は、実行時にセルが適用されたブラシパレットで着色されていないことです。

奇妙なことに、何かが働いています。なぜなら、各行を選択すると、色付けされるはずのセルが、デフォルトの「選択」よりも異なる色(この場合は明るい白色)で強調表示されるからです。青"。したがって、何らかの理由で、セルが変換されてIValueConverterを呼び出すにもかかわらず、レイアウトはNOTです。また、CellStyleをストレートカラー(この場合はLimeGreen)に設定し、IValueConverterを完全に無視し、Lime-GreenのDID APPEARセルを無視する別のテストを実行しました。これは私に、BindingとConvert()の間の何かが間違っていると信じさせます。

Googleの最初の数ページですべての検索結果を使い果たしてしまったので、ここで誰かが自分のコードとポイントを調べることを願っていますDataGridがこのように動作している理由を正確に私に伝えてください。

DataTable dt = new DataTable(); 
     dt = ((DataSet)ItemSource).Tables[0]; 
     int counter = 0; 

     foreach (DataColumn dc in dt.Columns) 
     { 
      switch(dc.ColumnName) 
      { 
      (....) 
      case "SEAPCT": 
        DataGridTextColumn col2 = new DataGridTextColumn(); 

        col2.Header = (((DataSet)ItemSource).Tables[0].Columns[counter].ToString()).Replace("PCT", "%"); 
        col2.Binding = new Binding(dc.ColumnName); 

        Style style = new Style(typeof(DataGridCell)); 

        Setter setter = new Setter(); 
        setter.Property = DataGridCell.BackgroundProperty; 

        Binding b = new Binding(dc.ColumnName); 
        b.Converter = new PercentCellConverter(); 

        setter.Value = b; 
        style.Setters.Add(setter); 

        col2.CellStyle = style; 


        DashboardGrid.Columns.Insert(counter, col2); 
        counter++; 
        break; 
      } 
     } 

     DashboardGrid.ItemsSource = dt.DefaultView; 
    } 

そして、参照のため、私IValueConverterクラス:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string n = value.ToString(); 
     System.Diagnostics.Debug.WriteLine(n); 

     if (double.Parse(n) > 0) 
      return Brushes.LimeGreen; 
     else if (double.Parse(n) == 0) 
      return Brushes.Yellow; 
     else 
      return Brushes.Red; 

    } 
+0

このコードでは問題はありません(一般的に言うと難しくなりますが)、カスタムテンプレートをDataGridやDataGridCellに適用しましたか? –

+0

@ H.B。カスタムテンプレートはありません。ここに表示されているものは、DataGridに適用されているものです。追加のXAMLはありません。 –

+0

さて、私はそのコードを取って、アイテムのソースとそれぞれのバインディングを変更するだけです。 –

答えて

1

私はそれを考え出した:私のIValueConverterクラスでは、私はSystem.Drawing.Brushes代わりのSystem.Windows.Media.Brushesを使用していました。だから、私のコンバーターWASが正しく動作している間に、間違ったタイプのカラーグループを返すだけで、色が表示されませんでした。

+0

私はあなたが簡単にこの1つをデバッグすることができたと思う、私は(コンバータが呼び出されたように)バインディング自体が働いたので、Visual Studioの出力ウィンドウを見てください。そのウィンドウにバインディングエラーが表示されるため、コンバータによって発生した無効な型の割り当てからスローされた例外が表示されます。 –

+0

@ H.B。うん、私は本当に持っている必要があります。なぜ私はしなかったのだろう。私は完全に忘れてしまったのは、ブラシで2つの名前空間があり、そこには問題が複雑になりました。 –