2016-09-27 20 views
-2

データテーブル内にダイナミックカラムを取得しています(カラムが動的に生成されるため、モデルがありません)。これはWPFデータグリッドにバインドされています。これらは自動生成カラムです。それぞれの列にカンマで区切られた値を持つ列(進捗)があります。これらの値はcolumn1、column2、column3のセルの色を決定します。私は個々のセルのスタイルの色を設定する方法が必要です。特定の列の列(Progress)からの値。動的生成カラムを使用したDataGridセルスタイリング

| Coulmn1 | Coumn2 | Column3 | Progress | | 123 | ABC | TRUE | C1=0.5,C2=1,C3=0 | | 456 | CDF | TRUE | C1=1,C2=1,C3=0 | | 789 | EFG | TRUE | C1=0,C2=1,C3=0 | 色は0 =レッド、0.5 = LightRedになります1 =グリーン 例えば | Coulmn1 | Coumn2 | Column3 | Progress | | 123 (LightRed) | ABC (Green) | TRUE (Red) | C1=0.5,C2=1,C3=0 |

+0

'DataGridCell'の暗黙のスタイルを作成し、コンバータを使用して背景色を設定します。コンバーターは行のデータ項目とセルがある列を知る必要があるので、おそらく 'MultiValueConverter'が必要です。コンバーターはデータ項目を 'DataGridRow'オブジェクトにキャストし、' Progress'セルを取得し、列に基づいてどの色を返すかを決める必要があります。代わりに、DataGrid用の適切なバッキングオブジェクトを作成し、これらのオブジェクトにデータを解析することもできます。これらのオブジェクトには、バインド可能な 'Color'プロパティが含まれています。私の好みは#2です。 – Rachel

答えて

0

このお試しください: ヘルパー:

public class ColumnNameAttribute : Attribute 
    { 
     public string Name { get; set; } 
     public TextAlignment TextAlignment { get; set; } 
     public string Color { get; set; } 
     public bool IsReadOnly { get; set; } 
     public double MinWidth { get; set; } 
     /// <summary> 
     /// Helper to fill column attributes: header name, text alignment, editability and background color 
     /// </summary> 
     /// <param name="name"></param> 
     /// <param name="textAlignment"></param> 
     /// <param name="isReadOnly"></param> 
     /// <param name="color"></param> 
     public ColumnNameAttribute(string name, TextAlignment textAlignment = TextAlignment.Left, bool isReadOnly = true, string color = "White") 
     { 
      Name = name; 
      TextAlignment = textAlignment; 
      Color = color; 
      IsReadOnly = isReadOnly; 
     } 

     public ColumnNameAttribute(string name, double minWidth, TextAlignment textAlignment= TextAlignment.Left, bool isReadOnly = true, string color = "White") 
     { 
      Name = name; 
      TextAlignment = textAlignment; 
      IsReadOnly = isReadOnly; 
      Color = color; 
     } 
    } 

xaml.cs:

datagrid.AutoGeneratingColumn += dataGrid_AutoGeneratingColumn; 

private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
     { 
      var desc = e.PropertyDescriptor as PropertyDescriptor; 
      var att = desc.Attributes[typeof(ColumnNameAttribute)] as ColumnNameAttribute; 
      if (att != null) 
      { 
       e.Column.IsReadOnly = att.IsReadOnly; 
       e.Column.CellStyle = new Style(typeof(DataGridCell)); 
switch (att.Color) 
       { 
        case "LightGreen": 
         //BorderBrushProperty looks better 
         e.Column.CellStyle.Setters.Add(new Setter(BackgroundProperty, new SolidColorBrush(Colors.PaleGreen))); 
         e.Column.CellStyle.Setters.Add(new Setter(TextBox.ToolTipProperty, "<Enter value>")); 
         break; 
       } 
       e.Column.Header = att.Name; 
       e.Column.CellStyle.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, att.TextAlignment)); 
       if (att.MinWidth > 0) e.Column.MinWidth = att.MinWidth; 
      } 
     } 

オブジェクトクラス:

public Example{ 
[ColumnName("My Custom Name", TextAlignment.Right, false, "LightGreen")] 
    public string Name {get; set;} 
} 
関連する問題