【问题标题】:IValueConverter Issue with WPF DataGridCellsWPF DataGridCells 的 IValueConverter 问题
【发布时间】:2012-02-24 23:17:50
【问题描述】:

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

在花了两天时间浏览互联网之后,我决定使用 IValueConverter 来执行此操作。编写我的代码后,代码执行良好;我已经测试并看到 1)正在调用 IValueConverter 类,并且 2)它确实返回了画笔颜色。

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

奇怪的是,我知道 something 正在工作,因为当我选择每一行时,应该着色的单元格以不同的颜色(在本例中为亮白色)突出显示,而不是默认的“选择蓝色”。因此,无论出于何种原因,尽管单元格正在转换并调用 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;

    }

【问题讨论】:

  • 在该代码中看不到任何问题(尽管 c# 确实使一般情况下更难分辨),您是否将自定义模板应用于 DataGrid 和/或 DataGridCells?
  • @H.B.没有自定义模板。您在此处看到的所有内容都是应用于 DataGrid 的内容——没有额外的 XAML。
  • 好吧,当我使用该代码并更改项目源和相应的绑定时,它就可以工作了。
  • @H.B.您仍然在我编写的 C# 代码中执行此操作还是使用任何其他 XAML?正如我所说,它看似有效但没有给我正确的结果是令人讨厌的奇怪,所以如果你做了任何不同的事情,它会有所帮助。顺便说一句,感谢您的时间和帮助! :)
  • 正如我所说,我只是将 ItemsSource 更改为对象列表,并将绑定路径更改为项目类上的属性。您可能希望将代码拆分/缩减,直到隔离问题为止,也可以在没有干扰的干净项目中。

标签: c# wpf datagrid ivalueconverter datagridcell


【解决方案1】:

我想通了:在我的IValueConverter 课程中,我使用的是System.Drawing.Brushes 而不是System.Windows.Media.Brushes。因此,虽然我的转换器 WAS 工作正常,但颜色没有显示,这仅仅是因为我返回了错误类型的颜色组。

【讨论】:

  • 我认为您可以轻松调试这个,我没有提到您应该查看 Visual Studio 的输出窗口,因为绑定本身有效(因为调用了转换器)。绑定错误出现在该窗口中,因此您应该会看到由转换器导致的无效类型分配引发的异常。
  • @H.B.是的,我真的应该有。不知道为什么我没有。我完全忘记了其中有两个带有 Brushes 的命名空间,这使事情变得复杂。
猜你喜欢
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
相关资源
最近更新 更多