2012-06-05 80 views
0

这是我想要完成的: DataGridd上的绑定集合包含RowModel的实例,如下图所示(为了简单起见,将其简化为最小化),然后RowModel可以包含ValidationClass。如何更改DataGridCell上的背景,具体取决于绑定的复杂对象值

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”。

验证是从外部验证程序填充的数据库中获取的。 如果一个或多个列出现验证错误,则Collection每个错误都会填充一个ValidationClass。

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

DataTriggers或转换器,还是别的? 需要一些帮助,指出我在正确的方向。

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

回答

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。但它总比没有好。任何改进都欢迎。

1

触发器和转换器对于这个问题都是等价的。这里有触发了解决方案:

<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> 
+0

谢谢你的答案,但它对我没有多大帮助,或者我不明白。 DataGrid绑定到包含类型为'RowModel'的类的集合。 'RowModel'的每个实例都有一个包含'ValidationClass'类型实例的集合。每个'ValidationClass'都有一个映射到'RowModel'类中的道具。上面的例子只有在DataGrid的绑定集合包含'ValidationClass'的实例时才有效,对吗?我希望在集合有'RowModel'的场合时解决这个问题。 – Jobe

0

使用CellFormatting事件。在那里,你可以通过检查你的病情并设置颜色 -

e.CellStyle.BackColor

看到链接的MSDN示例。

+0

不幸的是,CellFormatting事件不适用于.net4 wpf DataGrid控制器,所以这对我不起作用。 – Jobe

相关问题