Flex - привязка свойства ViewStack selectedChild с использованием строкового значения - PullRequest
1 голос
/ 25 ноября 2008

Прикрепленный пример кода (псевдокод) компилируется, но выдает эту ошибку времени выполнения:

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 ]

3 голосов
/ 01 декабря 2008

, когда 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>
0 голосов
/ 19 апреля 2009
<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 Я получаю предупреждение, но это работает

0 голосов
/ 26 ноября 2008

Вы хотите установить свойство 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.

0 голосов
/ 26 ноября 2008

Я предполагаю, что это не сработает, поскольку привязка будет оценена при инициализации, когда в то время дочерние элементы стека еще не были созданы. Даже при установке creationPolicy на «все» проблема все еще возникает.

Вам необходимо установить привязку к targetViewName при создании стека просмотра (и, возможно, также его дочерних элементов).

0 голосов
/ 26 ноября 2008

Извините, / Нильс, это не работает. Попробуйте скомпилировать этот код, и вы увидите, что 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>
0 голосов
/ 26 ноября 2008

попробовал это:

selectedChild="{this[targetViewName]}">

/ Niels

...