0

我现在很困,所以这只是我想要的一个例子(显然这段代码是错误的):

<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Declarations>

        <s:ArrayCollection id="dp"> 
            <fx:Object label="Just a label" text="Bla bla bla..."/>
            <fx:Object label="Just a label" text="Bla bla bla..."/>
            <fx:Object label="Just a label" text="Bla bla bla..."/>
        </s:ArrayCollection>

    </fx:Declarations>

    <s:ButtonBar dataProvider="{tabs}" />

    <mx:ViewStack id="tabs" resizeToContent="true">

        <s:DataGroup dataProvider="{dp}">

            <s:NavigatorContent label="{data.label}">
                <s:Label text="{data.text}"/>
            </s:NavigatorContent>

        </s:DataGroup>

    </mx:ViewStack>

</s:Application>

我怎么能做这样的事情?(NavigationContent 将是 itemRenderer 并且 ButtonBar 非常重要)。

4

1 回答 1

0

您不能将数据组ViewStack直接放在...中需要实现的项目INavigatiorContent

所以,这是我能想到的最好的了。它当然不处理更新ArrayCollection或比这更高级的东西,但它是一个开始。

<s:VGroup>
    <s:ButtonBar dataProvider="{tabs}" />

    <mx:ViewStack id="tabs" resizeToContent="true"  >
        <mx:addedToStage>
            <![CDATA[
                for(var i:int = 0; i < dp.length; i++) {
                    var label:Label = new Label();
                    label.text = dp.getItemAt(i).text;

                    var context:NavigatorContent = new NavigatorContent();
                    context.label = dp.getItemAt(i).label;
                    context.addElement(label);

                    tabs.addChild(context);
                }
            ]]>
        </mx:addedToStage>
    </mx:ViewStack>
</s:VGroup>

如果我真的要做到这一点,我会创建一个派生自ViewStack包含dataProvider属性的新类。在内部,我会听取集合的更改,以便添加/删除项目。此类还将包含一个itemRenderer属性,以便您可以定义选项卡的外观。

这样做的问题在于,通常使用选项卡时,您会拥有与数据一起使用的特定视图。您可能希望包含一个itemRendererFunction为您进行映射的方法。

它会变得有点凌乱和泄漏......但你可以让它发生。

于 2011-05-13T00:48:55.650 回答