Flex - 使用字符串值绑定ViewStack selectedChild属性

时间:2008-11-25 19:17:09

标签: flex data-binding actionscript binding

附加的代码示例(伪代码)编译,但抛出此运行时错误:

TypeError: Error #2007: Parameter child must be non-null.
    at flash.display::DisplayObjectContainer/getChildIndex()
    at mx.core::Container/getChildIndex()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\core\Container.as:2409]
    at mx.containers::ViewStack/set selectedChild()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\containers\ViewStack.as:557]


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            [Bindable]
            private var targetViewName:String = "content";
        ]]>
    </mx:Script>

    <mx:ViewStack id="viewStack" width="100%" height="100%" 
        selectedChild="{Container(viewStack.getChildByName(targetViewName))}">
        <mx:Panel id="welcome" width="100%" height="100%" />

        <mx:Panel id="content" width="100%" height="100%" />
    </mx:ViewStack>
</mx:Application>

有什么方法可以让我无需调用函数来设置selectedChild就能使用它?

感谢。

6 个答案:

答案 0 :(得分:3)

当selectedChild被触发时,viewStack没有添加任何子节点,因此抛出NullPointerException:

以下内容可行:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            import mx.core.Container;
            [Bindable]
            private var targetViewName:String = "content";

            private function onClick() : void
            {
                viewStack.selectedChild = Container(viewStack.getChildByName(targetViewName)) ;
            }
        ]]>
    </mx:Script>

    <mx:ViewStack id="viewStack" width="100%" height="100%" >
        <mx:Panel id="welcome" width="100%" height="100%"  title="welcome"/>

        <mx:Panel id="content" width="100%" height="100%" title="content" />
    </mx:ViewStack>

    <mx:Button click="onClick()" label="click" />

</mx:Application>

答案 1 :(得分:0)

尝试了这个:

selectedChild="{this[targetViewName]}">

/尼尔斯

答案 2 :(得分:0)

抱歉,/ Niels,这不起作用。尝试编译这段代码,你会看到selectedChild没有改变(你也得到了编译警告):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
        <![CDATA[
            [Bindable]
            private var targetViewName:String = "content";
        ]]>
    </mx:Script>

    <mx:TabNavigator id="viewStack" width="100%" height="100%" creationPolicy="all" 
        selectedChild="{this[targetViewName]}">
        <mx:Panel id="welcome" width="100%" height="100%" label="welcome" />

        <mx:Panel id="content" width="100%" height="100%" label="content" />
    </mx:TabNavigator>
</mx:Application>

答案 3 :(得分:0)

我的猜测是,这不起作用,因为绑定将在初始化时进行评估,此时尚未创建视图堆栈的子节点。即使将creationPolicy设置为“all”,问题仍然存在。

创建视图堆栈时(或者也可能是其子窗口),您必须设置与targetViewName的绑定。

答案 4 :(得分:0)

一旦目标位于显示列表中,您就要设置selectedChild属性。试试这个:

<mx:TabNavigator id="viewStack" width="100%" height="100%" creationPolicy="all" >
    <mx:Panel id="welcome" width="100%" height="100%" label="welcome" />

    <mx:Panel id="content" width="100%" height="100%" label="content" addedToStage="viewStack.selectedChild = this" />
</mx:TabNavigator>

如果你真的想绑定selectedChild,那么创建一个可绑定的函数,返回你想要选择的面板,但前提是它只是viewStack的子节点。

答案 5 :(得分:0)

<mx:Script>
    <![CDATA[
        import models.ModelLocator;

        [Bindable]
        private var model:ModelLocator = ModelLocator.getInstance();
    ]]>
</mx:Script>

<mx:ViewStack id="videoViewStack" width="100%" height="100%" selectedChild="{this[model._videoViewStack]}" >
    <viewsVideos:AllVideos id="AllVideos" label="Videos"/>
    <viewsVideos:MainVideo id="MainVideo" label="Video"/>
</mx:ViewStack>

这会绑定一个字符串var我会收到警告,但它可以正常工作