Appendix: Literally two minutes after I returned to work, I found a "graceful" solution using skin.
If you apply your own skinclass to the tab bar, you can bind the tab.enabled property as you expected / want.
<fx:Script> <![CDATA[ [Bindable] private var tab2IsReady:Boolean = false; private function checkCriteria():void{ tab2IsReady = someOtherThing.isFinished;//Boolean } ]]> </fx:Script> <s:TabBar id="theTabBar" dataProvider="{viewStack}" skinClass="skins.CustomTabBarSkin"/> <mx:ViewStack id="viewStack"> <s:NavigatorContent label="Tab index 0"> </s:NavigatorContent> <s:NavigatorContent label="Tab index 1" enabled="{tab2IsReady}"> </s:NavigatorContent> </mx:ViewStack>
When you enter "skinClass", use auto complete to generate (in FlashBuilder ~ 4.5 + ???) a custom skin (named whatever). The code will appear as shown below (I left the Script tag).
<?xml version="1.0" encoding="utf-8"?> <s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:fb="http://ns.adobe.com/flashbuilder/2009" alpha.disabled="0.5"> <fx:Metadata> <![CDATA[ /** * @copy spark.skins.spark.ApplicationSkin#hostComponent */ [HostComponent("spark.components.TabBar")] ]]> </fx:Metadata> <s:states> <s:State name="normal" /> <s:State name="disabled" /> </s:states> <s:DataGroup id="dataGroup" width="100%" height="100%"> <s:layout> <s:ButtonBarHorizontalLayout gap="-1"/> </s:layout> <s:itemRenderer> <fx:Component> <s:ButtonBarButton skinClass="spark.skins.spark.TabBarButtonSkin" /> </fx:Component> </s:itemRenderer> </s:DataGroup> </s:Skin>
Edit:
<fx:Component> <s:ButtonBarButton skinClass="spark.skins.spark.TabBarButtonSkin" /> </fx:Component>
To:
<fx:Component> <s:ButtonBarButton skinClass="spark.skins.spark.TabBarButtonSkin" enabled="{data.enabled}" /> </fx:Component>
Then any <s:NavigatorContent/> in the ViewStack with its property set or binding turned on will do what you expect (it will be enabled when true, and disabled when false).
source share