Как динамически заполнить mx: ViewStack с помощью dataProvider для навигации с вкладками? - PullRequest
0 голосов
/ 13 мая 2011

Я сейчас очень сонный, так что это всего лишь пример того, что я хочу (очевидно, этот код неправильный):

<?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 голосов
/ 13 мая 2011

Вы не можете поместить группу данных в 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, чтобы сделать отображение для вас.

Это было бы немного грязно и протекает ... но вы могли бы сделать это.

...