0

这就是我想要完成的: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 中有错误的列。ValidationClass 的 Tag 属性可以是“Critical”或“Warning”。

验证是从由外部验证器填充的数据库中获取的。如果一个或多个列发生验证错误,则每个错误都会用一个 ValidationClass 填充 Collection。

现在,如果我想在有严重错误的单元格上设置红色背景颜色,在有警告的单元格上设置黄色背景,我该怎么做?

DataTriggers 或 Converters,还是别的什么?需要一些帮助来指出我正确的方向。

编辑:为了清除,我为此使用 C# .net4 WPF DataGrid。

4

3 回答 3

1

triggers and converters are both equaly valid for that problem. Here the solution with trigger:

<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>
于 2012-06-05T15:27:31.990 回答
1

这就是我使用转换器解决它的方法。

拥有一个带有指定列的 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>

然后我附加了一个带有 DataTriggers 的样式,如下所示:

<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 上却很重。但总比没有好。欢迎任何改进。

于 2012-06-11T08:25:24.883 回答
0

使用CellFormatting事件。在那里您可以检查您的状况并使用 -

e.CellStyle.BackColor

请参阅链接中的 msdn 示例。

于 2012-06-05T15:30:23.827 回答