1

我正在使用 XamDataGrid (Infragistics-control) 来显示一些分层数据。我最多可以拥有 10 个级别的对象,并且我需要能够为每个级别赋予特定的背景颜色。我使用 AssigningFieldLayoutToItem 事件来获取项目的“级别”,我想最好也在这里分配背景/样式。

我已尝试指定 DataRecordCellArea 样式甚至 CellValuePresenter 样式,但我无法让其中任何一个与 FieldLayouts 一起使用。

另一种解决方案是为每个级别编写一个 FieldLayout,但这会创建很多不必要的 XAML 代码。

关于我应该做什么的任何建议?

4

1 回答 1

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();
    }
}

以下将设置用于具有 Key1 和 Key2 的字段的颜色:

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

如果您对多个字段重用相同的 FieldLayout,那么您可以使用 InitializeRecord 事件并更改样式以绑定到 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;
    }
}

请注意,我没有添加用于确定要使用的画笔的条件逻辑,并且仍然需要为不同的级别完成以具有不同的背景。

于 2012-04-08T17:53:54.173 回答