Как да стигнете до данните на Apache Wicket PropertyColumn, за да промените динамично CSS класа въз основа на съдържанието?

Имам страница на Apache Wicket, която има DataTable с колона, която трябва да показва състоянията, червено, жълто, зелено. Ако съдържанието на колоната е червено, искам да променя CSS класа на червено състояние, ако е жълто жълто състояние, иначе зелено състояние. Изглежда не мога да стигна до данните по начина, по който можете от колона със свойства, върху която може да се кликне. Как стигате до данните в PropertyColumn или има друг начин да направите това в DataTable? Благодаря ти!

АКТУАЛИЗИРАНЕ

Благодаря ти, Мартин. Ето какво измислих:

@Override
public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, final IModel<T> rowModel) {
    Label label = new Label(componentId, getDataModel(rowModel));
    cellItem.add(label);
    LOGGER.debug("populateItem: label DefaultModelObject: {}", (String) label.getDefaultModelObject());

    label.add(new AttributeModifier("class", new AbstractReadOnlyModel<String>() {
        private static final long serialVersionUID = 1L;

        ProcessingTime  processingTime = (ProcessingTime) rowModel.getObject();
        @Override
        public String getObject() {
            String cssClass = null;
            if (StringUtils.equals("Red", processingTime.getStatus())) {
                cssClass = "red-status";
            } else if (StringUtils.equals("Yellow", processingTime.getStatus())) {
                cssClass = "yellow-status";
            } else if (StringUtils.equals("Green", processingTime.getStatus())) {
                cssClass = "green-status";
            } else {
                cssClass = "process-status";
            }
            return cssClass;
        }
    }));
}

Таблица с динамичен css в клетки


person Barry Wadsworth    schedule 09.11.2013    source източник


Отговори (1)


Първо, вижте populateItem на PropertyColumn, как изглежда внедряването в Wicket 6 (подобно на други версии) е:

public class PropertyColumn<T, S> extends AbstractColumn<T, S> implements IExportableColumn<T, S, Object>
...
    @Override
    public void populateItem(final Item<ICellPopulator<T>> item, final String componentId,
        final IModel<T> rowModel)
    {
        item.add(new Label(componentId, createLabelModel(rowModel)));
    }
...
}

Трябва да промените вътрешния компонент, който се създава като етикет на колоната.

Първи метод: създайте свой собствен компонент (също вашият компонент може да съдържа свой собствен механизъм за създаване на css клас или стил, вместо да добавя AttributeModifier тук):

@Override
public void populateItem(final Item<ICellPopulator<T>> item, final String componentId,
    final IModel<T> rowModel)
    {
    super.populateItem(item, componentId, rowModel);
    MarkupContainer c = item.get(componentId);
    c.add(new AttributeModifier("class", new AbstractReadonlyModel<String>() {

    private static final long serialVersionUID = 1L;

    @Override
    public String getObject() {
        // some logic how to which css you want to apply
        return "MY-CSS-CLASS";
    }



}));

}

или можете да оставите Wicket да създаде самия компонент Label и просто да добавите AttributeModifier:

@Override
public void populateItem(final Item<ICellPopulator<T>> item, final String componentId, final IModel<T> rowModel) 
    {
    super.populateItem(item, componentId, rowModel);
    Label l = new Label(componentId, createLabelModel(rowModel));
    item.add(l);
    l.add(new AttributeModifier("class", new AbstractReadonlyModel<String>() {

    private static final long serialVersionUID = 1L;

    @Override
    public String getObject() {
        // some logic how to which css you want to apply
        return "MY-CSS-CLASS";
    }



}));

}

ЗАБЕЛЕЖКА: методът 'createLabelModel' е отхвърлен във Wicket 6, вместо да се използва 'getDataModel' вместо него.

person Martin Strejc    schedule 09.11.2013
comment
Мартин, благодаря ти за предложенията. Опитах тези и CSS се задава за колоната, но не и за клетката. Опитах различни подходи, но цветът на шрифта в CSS винаги се прилага към цялата колона. - person Barry Wadsworth; 12.11.2013
comment
Ако добавите някакво условие към AttributeModifier, ще го получите. Имате модела на реда, който трябва да бъде изобразен, така че можете да имплементирате нещо като 'return rowModel.getObject.isMyRow()? my-red-css-class : default-css-class'; - person Martin Strejc; 13.11.2013