2011-09-22 60 views
1

我正在使用XamDataGrid(Infragistics控件)来显示一些分层数据。我可以有多达10个关卡的对象,我需要能够给每个关卡一个特定的背景颜色。我使用AssigningFieldLayoutToItem事件来获取项目的“级别”,我想这里最好还是在这里指定背景/样式。着色分层XamDataGrid

我已经试过指定DataRecordCellArea风格,甚至是CellValuePresenter风格,但我无法得到任何这些与FieldLayouts一起使用。

另一种解决方案是为每个级别编写一个FieldLayout,但这会产生大量不必要的XAML代码。

对于我应该怎么做的任何建议?

回答

1

如果您为每个级别都有不同的FieldLayout,则可以使用单个样式将DataRecordPresenter与转换器一起设置为背景。

XAML:

<local:BackgroundConverter x:Key="BackgroundConverter"/> 
<Style TargetType="{x:Type igDP:DataRecordPresenter}"> 
    <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=FieldLayout.Key, Converter={StaticResource BackgroundConverter}}"/> 
</Style> 

转换器:

public class BackgroundConverter:IValueConverter 
{ 
    public BackgroundConverter() 
    { 
     this.Brushes = new Dictionary<string, Brush>(); 
    } 

    public Dictionary<string, Brush> Brushes {get;set;} 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value is string) 
     { 
      string key = value.ToString(); 
      if (this.Brushes.ContainsKey(key)) 
       return this.Brushes[value.ToString()]; 
     }     
     return Binding.DoNothing; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

下面我们来设置颜色用来与密钥1字段和键2:

BackgroundConverter backgroundConverter = this.Resources["BackgroundConverter"] as BackgroundConverter; 
backgroundConverter.Brushes.Add("Key1", Brushes.Green); 
backgroundConverter.Brushes.Add("Key2", Brushes.Yellow); 

如果您重用相同FieldLayout用于多个字段,然后您可以使用InitializeRecord事件并将样式更改为bin d的DataRecord像这样的标签:

XAML:

<Style TargetType="{x:Type igDP:DataRecordPresenter}"> 
    <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Record.Tag}"/> 
</Style> 

C#:

void XamDataGrid1_InitializeRecord(object sender, Infragistics.Windows.DataPresenter.Events.InitializeRecordEventArgs e) 
{ 
    if (!e.ReInitialize) 
    { 
     // Set the tag to the desired brush. 
     e.Record.Tag = Brushes.Blue; 
    } 
} 

请注意,我没有添加条件逻辑用于确定刷使用,并且仍然需要为不同的层次完成不同的背景。