Вопрос

Похоже, что новый компонент списка Spark не чтит IDropInItemRenderer интерфейс.

Т.е., если я внедрим IDropInItemRenderer на моем рендерере, сеттер listData никогда не называется.

Я что -то упускаю, или этот интерфейс теперь устарел?

Если да, то каков предлагаемый подход для предоставления аналогичной информации о контексте DataProvider для рендерера?

Например, я хочу, чтобы рендерер для последнего элемента в коллекции вел себя немного по -разному.

я вижу это IItemRenderer Теперь определяет listIndex Свойство, однако, этот подход не работает, не зная подсчета исходного DataProvider.

Это было полезно?

Решение

Вот обходной путь, который я в итоге использовал.

По -своему, DataGroup составляет композиционное доброту Spark, поскольку она выставляет rendererUpdateDelegate свойство, которое вы можете установить с помощью своего собственного класса, чтобы обеспечить любую пользовательскую функцию, которую вы хотите.

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

Вот пример класса. В моем примере я хочу, чтобы последний рендерер имел его collapsable свойство установлено на false:

/**
 * Decorates another IItemRendererOwner (eg., a DataGroup) and augments the updateRenderer method
 * to set the isCollapsable property */
public class ThreadMessageRendererUpdateDelegate implements IItemRendererOwner
{
    private var _dataGroup:DataGroup;

    public function get dataGroup():DataGroup
    {
        return _dataGroup;
    }

    public function set dataGroup(value:DataGroup):void
    {
        _dataGroup = value;
        if (dataGroup)
        {
            dataGroup.rendererUpdateDelegate = this;
        }
    }


    public var dataProvider:ArrayCollection;

    public function ThreadMessageRendererUpdateDelegate(owner:DataGroup=null)
    {
        this.dataGroup = owner;
    }

    public function itemToLabel(item:Object):String
    {
        return dataGroup.itemToLabel(item);
    }

    public function updateRenderer(renderer:IVisualElement, itemIndex:int, data:Object):void
    {
        dataGroup.updateRenderer(renderer,itemIndex,data);
        if (renderer is ThreadMessageRenderer)
        {
            ThreadMessageRenderer(renderer).collapsable = itemIndex < dataProvider.length - 1;
        }
    }
}

А вот и пример использования:

<fx:Declarations>
    <viewer:ThreadMessageRendererUpdateDelegate dataProvider="{dataProvider}" dataGroup="{threadList}" />
</fx:Declarations>
<fx:Script>
    <![CDATA[
        [Bindable]
        public var dataProvider:ArrayCollection
    ]]>
</fx:Script>
    <s:DataGroup height="100%"
                 width="100%"
                 dataProvider="{dataProvider}"
                 itemRenderer="ThreadMessageRenderer"
                 id="threadList"
                 >
    </s:DataGroup>

Другие советы

Мужчина! Только что потратил вечность, пытаясь найти DataGroup.rendererUpdateDelegate(...), В конце концов обнаружив, почему я не мог, благодаря этому посту.

В любом случае, думая о (исчезновении) rendererUpdateDelegate Собственность и ваше предложение немного больше, я понимаю, что ни один из них не действительно необходимы.

DataGroup имеет rendererAdd событие, которое дает вам достаточно информации в нужное время, чтобы делать то, что вы хотите; Например:

...

<s:DataGroup id="dg"
    dataProvider="{model.dataProvider}"
    itemRenderer="{model.itemRendererFactory}"
    rendererAdd="model.updateRenderer(event.data, event.index, event.renderer)">

...

... и в model у нас есть:

public function updateRenderer(data:Object, index:int, renderer:IVisualElement):void
{
    if (renderer is ICollapsable)
    {
        ICollapsable(renderer).collapse = index < dataProvider.length - 1;
    }
}

Меньше строк кода и более четких намерений

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top