1

似乎新的 spark List 组件不支持该IDropInItemRenderer接口。

即 - 如果我IDropInItemRenderer在我的渲染器上实现,listData则永远不会调用 setter。

我是否遗漏了什么,或者这个界面现在已被弃用?

如果是这样,向渲染器提供类似的 dataProvider 上下文信息的建议方法是什么?

例如,我希望集合中最后一项的渲染器行为稍有不同。

我看到IItemRenderer现在定义了一个listIndex属性,但是这种方法在不知道源 dataProvider 的计数的情况下不起作用。

4

2 回答 2

1

这是我最终使用的解决方法。

以它自己的方式,它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>
于 2010-12-31T17:18:24.127 回答
0

男人!只是花了很长时间试图找到DataGroup.rendererUpdateDelegate(...),最终发现为什么我不能,感谢这篇 SO 帖子。

无论如何,考虑一下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;
    }
}

更少的代码行和更清晰的意图

于 2012-06-28T16:46:09.257 回答