我有一个带有动态生成的列的 DataGrid,我需要更改单元格的样式,这些单元格的值在某些操作后已更改。

DataGrid 的 ItemsSource 定义为 List<MyTableRow>, , 在哪里

public class MyTableRow
{
    private string[] _values;
    private string _rowHeader;

    // getters and setters here
}

DataGrid 列是使用以下代码生成的:

for (int i = 0; i < source[0].Values.Length; i++)
{
    var col = new DataGridTextColumn();
    var binding = new Binding("Values[" + i + "]");
    col.Binding = binding;
    col.CanUserSort = false;
    this.dataGrid.Columns.Add(col);
    this.dataGrid.Columns[i].Header = columnNames[i];
}

结果 DataGrid 看起来像

当我尝试突出显示 ItemsSource 中的值已更改的单元格(粗体文本或彩色背景)时,就会出现问题。这就是我的问题分为两个的点:

  1. 是否有一些“内置”方法可以处理更改的单元格?(也许与 ObservableColletion 或其他)
  2. 如果不是,我如何根据索引或值突出显示单独的单元格

我尝试使用 xaml 样式和/或触发器来执行此操作,但事实证明我不知道应该将什么值致盲传递给转换器

<Style TargetType="TextBlock">
    <Setter Property="Background" 
            Value="{Binding <!-- some proper binding here -->, 
                    Converter={StaticResource ValueToBrushConverter}}"/>
</Style>

在 SO 上找到的其他解决方案要么具有相同的绑定“问题”,要么根本不起作用。我能做什么来突出 单元格而不是整行/列?我可以更改 ItemsSource, MyTableRow 字段和/或列的生成代码(如有必要)

有人可以帮我吗?自从我遇到这个问题以来已经几天了


更新 找到解决方案


有帮助吗?

解决方案

终于知道如何做我想做的事了。该解决方案有点“脏”,但对我来说效果很好。我向需要突出显示的每个单元格添加了不间断空格字符

private const string NBSP = "\u00A0"

之后剩下要做的就是创建价值转换器。所以我添加了 MultiBinding 在我的 XAML 中:

<DataGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="Background">
            <Setter.Value>
                <MultiBinding Converter="{StaticResource ValueToBrushMultiConverter}" >
                    <MultiBinding.Bindings>
                        <Binding RelativeSource="{RelativeSource Self}" />
                        <Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}" />
                    </MultiBinding.Bindings>
                 </MultiBinding
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.CellStyle>

转换器定义为:

public class ValueToBrushMultiConverter : IMultiValueConverter
    {
        private const string NBSP = "\u00A0";
        public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var cell = (DataGridCell)values[0];
            var dgRow = (DataGridRow)values[1];

            var test = (dgRow.Item as TableRow<string, string>).Values[cell.Column.DisplayIndex];

            if (test.Contains(NBSP))
                return System.Windows.Media.Brushes.PaleGreen;
            return DependencyProperty.UnsetValue;           
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }

希望这对某人有帮助!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top