在WPF中为“随机” DataGrid单元着色

时间:2019-07-03 14:18:50

标签: c# wpf datagrid

我必须导入一个.ini文件,其中包含数据网格的数据,其格式如下:

Columns=2
Rows=10
Value_0_0=Header1
Value_1_0=Header2
Value_0_1= 12345
CellColor_0_1=255,0,0
....

并非每个单元格都必须具有颜色或值。在WinForms中,添加数据后更改单个单元格的背景颜色很容易,但是在wpf中...

当前,我生成一个数据表并设置datagrid.ItemsSource = Datatable.DefaultView

我阅读了有关wpf中单元格着色的一些答案,并尝试使用ItemContainerGenerator实现解决方案,如果启用RowVirtualization,该解决方案将失败。但是禁用虚拟化不是一种选择,行数可能很高,而如果没有虚拟化,行数会非常缓慢。

我还尝试通过各种方式将触发器与转换器一起使用

<DataGrid.Resources>
  <Style TargetType="DataGridCell">
   <Style.Triggers>          
    <DataTrigger Binding="{Binding Column, RelativeSource={RelativeSource Self}, Converter={StaticResource ConditionCnvKey}}" Value="True" >
    <Setter Property="Background" Value="{Binding color, Converter={StaticResource StringToColorCnvKey}}"/>
   </DataTrigger>
  </Style.Triggers>
 </Style>
</DataGrid.Resources>

public class PropBasedStringToColorConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            object result = null;

            if (value == null) return "N/A";

            if (value.GetType() == typeof(DataGridTextColumn))
            {
                string path = ((Binding)((DataGridTextColumn)value).Binding).Path.Path;
                return path;
            }
            else if (value.GetType() == typeof(string))
            {
                result = new SolidColorBrush((Color)ColorConverter.ConvertFromString(value.ToString()));
            }
            return result;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

但是由于列的变化,我无法检查预定义的列名,并且单元格不包含颜色值。

有人有什么建议吗?

0 个答案:

没有答案