Раскраска иерархической XamDataGrid - PullRequest
1 голос
/ 22 сентября 2011

Я использую XamDataGrid (Infragistics-control) для отображения некоторых иерархических данных. У объектов, которые я могу иметь до 10 уровней, и я должен быть в состоянии дать каждому уровню определенный цвет фона. Я использую событие AssigningFieldLayoutToItem, чтобы получить «уровень» элемента, и было бы лучше назначить также фон / стиль здесь, я полагаю.

Я попытался указать стиль DataRecordCellArea и даже стиль CellValuePresenter, но я не могу заставить ни один из них работать с FieldLayouts.

Другое решение - написать FieldLayout для каждого уровня, но это создаст много ненужного XAML-кода.

Какие-нибудь предложения относительно того, что я должен сделать?

1 Ответ

1 голос
/ 08 апреля 2012

Если у вас есть разные 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;
    }
}

Обратите внимание, что я не добавил условную логику для определения используемой кисти, и это все еще необходимо сделать, чтобы разные уровни имели разный фон.

...