Изменение цвета в ячейках xamDataGrid

У меня xamDataGrid привязано к DataTable, где первый столбец содержит справочные значения. Цвет всех остальных столбцов зависит от того, равно или не равно значение в ячейках значению опорного столбца. Логика использует преобразователь.

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

Я слушаю событие FieldPositionChanged и аннулирую макет сетки, но это не работает:

grid.UpdateLayout();
grid.InvalidateVisual();

Точка останова в конвертере срабатывает, но не для всех записей (только 2 или 3).


person Karel Frajták    schedule 12.06.2012    source источник
comment
Можете ли вы предоставить стили, которые вы используете?   -  person alhalama    schedule 01.09.2012


Ответы (1)


Если вы установите CellValuePresenterStyle, когда поля перемещаются, они должны обновляться правильно. Следующая логика сделает это:

void XamDataGrid1_FieldPositionChanged(object sender, Infragistics.Windows.DataPresenter.Events.FieldPositionChangedEventArgs e)
{
    FieldLayout layout = e.Field.Owner;
    Field first = null;
    foreach (Field f in layout.Fields)
    {
        if (f.ActualPosition.Column == 0)
            first = f;
    }
    if (first != null)
    {
        SetCellValuePresenterStyle(e.Field.Owner, first);
    }
}

void XamDataGrid1_FieldLayoutInitialized(object sender, Infragistics.Windows.DataPresenter.Events.FieldLayoutInitializedEventArgs e)
{
    SetCellValuePresenterStyle(e.FieldLayout, e.FieldLayout.Fields[0]);
}

void SetCellValuePresenterStyle(FieldLayout layout, Field sourceField)
{
    Binding sourceValueBinding = new Binding("DataItem[" + sourceField.Name + "]");
    foreach (Field f in layout.Fields)
    {
        if (f != sourceField)
        {
            Style cellValuePresenterStyle = new Style(typeof(CellValuePresenter));
            Binding compareValueBinding = new Binding("DataItem[" + f.Name + "]");
            MultiBinding styleBinding = new MultiBinding();
            styleBinding.Bindings.Add(sourceValueBinding);
            styleBinding.Bindings.Add(compareValueBinding);
            styleBinding.Converter = new EqualMultiValueConverter();
            DataTrigger trigger = new DataTrigger();
            trigger.Value = true;
            trigger.Binding = styleBinding;
            cellValuePresenterStyle.Triggers.Add(trigger);
            Setter backgroundSetter = new Setter(Control.BackgroundProperty, Brushes.Green);
            trigger.Setters.Add(backgroundSetter);
            f.Settings.CellValuePresenterStyle = cellValuePresenterStyle;
        }
        else
        {
            f.Settings.CellValuePresenterStyle = null;
        }
    }
}
person alhalama    schedule 04.09.2012