如何使用dataProvider为选项卡式导航动态填充mx:ViewStack?

时间:2011-05-12 20:12:57

标签: flex flex4 flex-spark

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

<?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非常重要。)

1 个答案:

答案 0 :(得分: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来为您进行映射。

它会变得混乱和漏洞......但你可以实现它。