Переключение selectedIndex с компонентом кнопки - PullRequest
1 голос
/ 20 апреля 2011

Я пытаюсь контролировать свойство selectedIndex ViewStack в основном приложении. У меня есть переменная, назначенная в main.mxml. Я пытаюсь манипулировать этой переменной с помощью функции в пользовательском компоненте; viewControl.mxml. Мне удалось смоделировать эффект с помощью кнопки, но я бы предпочел сделать это с помощью кнопки.

Main.mxml

<?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" 
           xmlns:comps="comps.*" minWidth="955" minHeight="600">
<fx:Script>
    <![CDATA[
        import comps.viewControl;

        [Bindable]
        public var mainIndex:int = 0;


    ]]>
</fx:Script>

<comps:viewControl id="myControl"/>

<mx:ViewStack id="lgViewStack" selectedIndex="{mainIndex}">

    <s:NavigatorContent id="view1">
        <s:Panel id="firstPanel">
        </s:Panel>
    </s:NavigatorContent>
    <s:NavigatorContent id="view2">
        <s:Panel id="secondPanel">
        </s:Panel>
    </s:NavigatorContent>

</mx:ViewStack>

И компонент viewControl.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">

<fx:Script>
    <![CDATA[

        protected function changeView(index:int):void
        {
            mainIndex = index;

        }
    ]]>
</fx:Script>

<s:Button id="myButton" click="changeView(1);"/>

При компиляции я получаю следующее сообщение об ошибке: Доступ к неопределенному свойству mainIndex в viewControl.mxml. Есть ли что-то, что я могу сделать с набором функций или получить функцию mainIndex из Main.mxml?

1 Ответ

3 голосов
/ 20 апреля 2011

Как уже упоминалось в вашем комментарии, проблема заключается в области видимости переменной.Есть много способов сделать то, что вам нужно, но, по сути, вам нужно место, где вы можете ссылаться как на свой стек представлений, так и на свой элемент управления представлением в одной и той же области видимости (иначе из другого класса).Существуют целые фреймворки, созданные просто для того, чтобы предоставить способ получить эти ссылки там, где они вам нужны, но в вашем случае это довольно просто, поскольку родительский компонент уже ссылается на них обоих.

В вашем компоненте представления создайтелокальная (общедоступная и привязываемая) переменная для хранения текущего индекса на основе нажатия кнопки ...

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">

<fx:Script>
    <![CDATA[

        [Bindable]
        public var selectedIndex:int;

        protected function changeView(index:int):void
        {
            this.selectedIndex = index;

        }
    ]]>
</fx:Script>

<s:Button id="myButton" click="changeView(1);"/>

Затем в родительском компоненте вы можете привязать непосредственно к selectedIndex компонента представления ...

<comps:viewControl id="myControl"/>

<mx:ViewStack id="lgViewStack" selectedIndex="{myControl.selectedIndex}">
</mx:ViewStack>

Еще один способ сделать это - отправить событие в ваш viewControl при каждом изменении индекса.Затем вы можете сделать что-то подобное, используя обработчик событий в родительском компоненте ...

protected myControl_changeHandler(event:Event):void
{
  this.mainIndex = myControl.selectedIndex;
}

Таким образом, вы можете убедиться, что ваш родительский компонент также имеет актуальную ссылку на индекс..

...