2011-04-19 52 views
1

我想控制主应用程序上ViewStack的selectedIndex属性。我在main.mxml中分配了一个变量。我试图通过自定义组件中的函数来操作该变量; viewControl.mxml。我已经能够用buttonBar模拟效果,但我宁愿用按钮来完成。使用按钮组件切换selectedIndex

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中。有什么我可以做的功能集或功能获取从Main.mxml mainIndex?

+0

嗯。你在变量的范围上和你之前的问题有完全相同的问题http://stackoverflow.com/q/5719389/680503 – Constantiner 2011-04-19 21:44:00

+0

Flex中的变量范围是一个给我带来问题的概念。我还没有找到专门为我的目的解释它的资源。如果我从主应用程序创建一个公共函数或变量,那么直接附加的组件应该能够读/写它们。 – smulholland2 2011-04-19 22:17:42

+0

你是否清楚地了解面向对象的概念? Flex MXML文件只是普通的类。所以没有区别。 – Constantiner 2011-04-20 07:24:45

回答

3

正如您的评论中提到的那样,变量的范围是问题。有很多方法可以满足您的需求,但基本上您需要一个可以在同一个作用域(又称为另一个类)中引用视图堆栈和视图控件的地方。创建完整的框架只是为了提供一种在需要它们的地方获取这些引用的方法,但是对于您的情况来说,它很简单,因为父组件既已引用它们。

在您的视图组件,创建一个本地(公共和绑定)变量存储基础上,按一下按钮当前指数...

<?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; 
} 

这种方式可以确保您的父组件有一个最新的参考指标,以及...

+0

这只是我需要的方式。您在组件内部定义并绑定了一个变量,并通过组件对象新创建的属性(在本例中为变量selectedIndex)在父级上访问它。那是对的吗? ......它现在开始聚集在一起。谢谢。 – smulholland2 2011-04-19 23:09:40

+0

我想补充一点,这是好的,我会使用冒泡事件来代替更多的延展性,因为现在viewstack完全依赖于这个视图,我怀疑他是在尝试完成哪个视图(想想接下来的按钮)每个视图)。此外,史蒂夫,你肯定需要阅读更基本的软件原则,如类,面向对象等 – 2011-04-20 12:12:13

+0

我同意。我只是试图保持它的基本。婴儿的步骤。 :) – drkstr 2011-04-22 23:22:25