WPF DataGridCells的IValueConverter问题

时间:2012-02-24 23:17:51

标签: c# wpf datagrid ivalueconverter datagridcell

我有一个DataGrid,它通过DataSet从数据库填充其数据。现在,我需要做的是根据细胞的价值和一系列其他因素为细胞的背景着色。

经过两天的大部分时间搜索互联网后,我已经决定使用IValueConverter来执行此操作。编写代码后,代码执行正常;我已经测试并且已经看到1)正在调用IValueConverter类并且2)它确实返回了Brush Color。

我的问题是在运行时没有使用应用的画笔调色板对单元格进行着色。

奇怪的是,我知道某事正在起作用,因为当我选择每一行时,应该着色的单元格以不同的颜色(在这种情况下,亮白色)突出显示默认的“选择蓝色”。因此,无论出于何种原因,尽管单元格正在转换AND调用IValueConverter,但布局 NOT 显示它。我还进行了另一项测试,我只是将CellStyle设置为直颜色(在本例中为LimeGreen)并完全忽略了IValueConverter,并且单元格在Lime-Green中显示。这让我相信Binding和Convert()之间的某些地方出了问题。

我对于为什么没有显示转换颜色感到困惑,而且我已经用尽了谷歌前几页的每一个搜索结果,所以我希望有人在这里看看我的代码并指出对我来说,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;

    }

1 个答案:

答案 0 :(得分:1)

我明白了:在我的IValueConverter课程中,我使用System.Drawing.Brushes代替System.Windows.Media.Brushes。因此,当我的转换器 WAS 正常工作时,颜色不会显示,因为我返回了错误类型的颜色组。

相关问题