Question

Il semble que la nouvelle composante de la liste d'allumage ne respecte pas l'interface IDropInItemRenderer.

Ie -. Si je mets en œuvre IDropInItemRenderer sur mon renderer, le poseur de listData est jamais appelé

Suis-je manque quelque chose, ou est cette interface maintenant dépréciée?

Si oui, quelle est l'approche proposée pour fournir des informations de contexte dataProvider similaire au moteur de rendu?

Par exemple, je veux que le moteur de rendu pour le dernier élément d'une collection à se comporter de façon légèrement différente.

Je vois que IItemRenderer définit maintenant une propriété listIndex, mais cette approche ne fonctionne pas sans savoir le compte du fournisseur de données source.

Était-ce utile?

La solution

Voici la solution que j'ai fini par utiliser.

Dans sa manière, la DataGroup coule la bonté de composition de Spark, en ce qu'elle expose une propriété rendererUpdateDelegate, que vous pouvez définir votre propre classe pour fournir tout functionliaty personnalisé que vous êtes après.

Alors qu'il est frustrant que l'interface a déposés sans être vraiment annoncé, cette approche est beaucoup plus puissant.

Voici un exemple de classe. Dans mon exemple, je veux le dernier générateur de l'avoir de propriété collapsable ensemble à 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;
        }
    }
}

Et voici un exemple d'utilisation de ce:

<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>

Autres conseils

Man

! Juste âges passé à essayer de trouver DataGroup.rendererUpdateDelegate(...), par la suite découvrir pourquoi je ne pouvais pas, avec la permission de ce poste SO.

Quoi qu'il en soit, en pensant à la (disparition de) propriété rendererUpdateDelegate et votre offre un peu plus, je me rends compte ne sont vraiment nécessaires.

DataGroup a l'événement rendererAdd qui vous donne assez d'informations, au bon moment, de faire ce que vous voulez; par exemple:

...

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

...

... et dans le model, nous avons:

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

Moins de lignes de code et de l'intention claire

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top