2012-06-05 83 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

相關問題