如何根据绑定的复杂对象值更改数据网格单元格的背景
本文关键字:数据网 数据 网格 背景 单元格 何根 绑定 复杂 对象 | 更新日期: 2023-09-27 18:36:26
这就是我想要完成的:DataGridd 上的绑定集合包含 RowModel 的实例,如下所示(为简单起见进行了最小化),然后 RowModel 可以包含 ValidationClass 的实例。
public class RowModel
{
public int RowId { get; set; }
public string Column1 { get; set; }
public string Column2 { get; set; }
public string Column3 { get; set; }
public ICollection<ValidationClass> Validations { get; set; }
}
public class ValidationClass
{
public string Tag { get; set; }
public string SourceColumn { get; set; }
public string ErrorText { get; set; }
}
ValidationClass.SourceColumns 引用 RowModel 中存在错误的列。验证类的 Tag 属性可以是"严重"或"警告"。
验证是从外部验证器填充的数据库中获取的。如果一个或多个列发生验证错误,则集合将为每个错误填充一个 ValidationClass。
现在,如果我想在具有严重错误的单元格上设置红色背景颜色,在具有警告的单元格上设置黄色背景,我该怎么做?
数据触发器或转换器,还是其他东西?需要一些帮助来为我指出正确的方向。
编辑:为了澄清,我正在使用C# .net4 WPF DataGrid。
触发器和转换器对于该问题都同样有效。这里是带有触发器的解决方案:
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Tag}" Value="Critical">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Tag}" Value="Warning">
<Setter Property="Background" Value="Yellow"/>
</DataTrigger>
这就是我使用转换器解决它的方式。
具有具有指定列的 DataGrid,每个列的定义如下:
<MyOwn:CustomDataGridColumn Header="Column1Header" Name="Column1" ElementStyle="{StaticResource ElementStyleWithMultiConverterAndTriggers}">
<MyOwn:CustomDataGridColumn.Binding>
<Binding Path="RowModel.ColumnName" ValidatesOnDataErrors="True" >
<Binding.ValidationRules>
<Validators:CustomCellDataInfoValidationRule />
</Binding.ValidationRules>
</Binding>
</MyOwn:CustomDataGridColumn.Binding>
</MyOwn:CustomDataGridColumn>
然后,我用 DataTrigger 附加了一个样式,如下所示:
<Style TargetType="{x:Type TextBlock}" x:Key="ElementStyleWithMultiConverterAndTriggers">
<Style.Resources>
<Utils:ErrorTypeConverter x:Key="ErrorTypeConverter"/>
</Style.Resources>
<Setter Property="TextBlock.Padding" Value="2" />
<Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
<Style.Triggers>
<DataTrigger Value="Critical" >
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource ErrorTypeConverter}">
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}" Path="Column.Name"/>
<Binding Path="RowModel" /> <!--Sending the whole row object as one of the parameters to the converter-->
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="Red"/>
</DataTrigger>
<DataTrigger Value="Warning" >
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource ErrorTypeConverter}">
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}" Path="Column.Name"/>
<Binding Path="RowModel" />
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="Background" Value="Yellow"/>
</DataTrigger>
</Style.Triggers>
</Style>
MultiValueConverter看起来像这样。
public class ErrorTypeConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var rowObject = values[1] as RowModel;
var param = values[0].ToString();
if (rowObject == null) return "";
if (rowObject.ValidationClass.Any())
{
var validationErrors = rowObject.ValidationClass.FirstOrDefault(x => x.SourceColumn == param);
if (validationErrors != null )
return validationErrors.Tag; // Will return "Critical" or "Warning"
}
return "";
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
这个套件是我的需求,但在搜索结果中有 1000+ 行的 DataGrid 上很重。但总比没有好。欢迎任何改进。
使用 CellFormatting 事件。在那里,您可以检查您的状况并使用 - 设置颜色
e.CellStyle.BackColor
请参阅链接中的 msdn 示例。