更新后WPF DataGrid单元格样式发生变化
-
21-12-2019 - |
题
我有一个带有动态生成的列的 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 中的值已更改的单元格(粗体文本或彩色背景)时,就会出现问题。这就是我的问题分为两个的点:
- 是否有一些“内置”方法可以处理更改的单元格?(也许与
ObservableColletion
或其他) - 如果不是,我如何根据索引或值突出显示单独的单元格
我尝试使用 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();
}
}
希望这对某人有帮助!
不隶属于 StackOverflow