2016-03-03 77 views
1

我想创建一个列表,其行为就像我的Mac上的Finder菜单。换句话说,如果我点击一个列表项目,保持我的鼠标停下来上下移动列表我希望所选项目改变。Flex更改列表项当鼠标关闭时选择

在我的Flex应用程序中,如果我点击我的列表,然后在鼠标仍然下移的情况下,上下移动列表中的选定项目保持不变。

任何意见将受到感谢。

感谢

回答

2

在StackOverflow的传统,我在更努力后发布了解决我自己的问题:

我有一个ItemRenderer的在我的名单。在ItemRenderer中,我声明了一个变量来保存对拥有列表的引用。

private var _parentList:List; 

在“设置数据”功能中,我将此变量设置为所有者列表。

override public function set data(value:Object):void { 
     super.data = value; 

     // Check to see if the data property is null. 
     if (value == null) 
      return; 

     // If the data property is not null. 

     // Get a reference to the parent list. 
     _parentList = this.owner as List; 
     ... 

然后我添加了一个EventListener来监听MouseDown事件。

 // Attach an eventListener to the ItemRenderer. 
     this.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver); 
     ... 

我的onMouseOver处理程序看起来像这样。

 private function onMouseOver(event:MouseEvent):void { 

      //trace(data.LocationName); 

      if (event.buttonDown == true) { 

       _parentList.selectedIndex = itemIndex; 
      } 
     } 

所以用这个来代替我可以在我的名单鼠标按下并保持鼠标按钮按下向上和向下移动与总是被选择的光标下方的列表项的列表。最后一部分是确保列表响应由ItemRenderer设置的selectedIndex。当用户通过与控件交互来更改selectedIndex属性时,控件将调度更改并更改事件。以编程方式更改selectedIndex属性的值时,它将调度valueCommit事件。为了确保我对选定列表项目的编程变化做出了响应,我在valueCommit事件中添加了一个处理程序。

<s:List 
     id="locationsList" 
     dataProvider="{presenter.locations}" 
     itemRenderer="itemrenderers.locationListItemRenderer" 
     useVirtualLayout="false" 
     width="1869.698" height="1869.698" 
     y="65.151" x="65.151" 
     borderVisible="true" 
     borderColor="{presenter.backgroundColour}" 
     contentBackgroundAlpha="0" 
     contentBackgroundColor="0xff336c" 
     labelField="label" 
     change="presenter.onLocationListChange(event)" 
     valueCommit="presenter.onLocationListValueCommit(event)"> 

    <s:layout> 
     <s:BasicLayout /> 
    </s:layout> 

    </s:List> 

到目前为止,它似乎工作正常。希望能帮助到你。

相关问题