dataProvider更新后如何以编程方式选择Flex列表中的项目?

时间:2011-01-02 22:12:52

标签: flex flash actionscript-3 events list

由于我对Flex有些新意,我可能会遗漏一些基本的东西。我有一个Spark List容器,其dataProvider绑定到从RemoteObject调用返回的结果集。很标准的东西。

<s:List id="list" dataProvider="{model.stuff}" width="100%" height="100%"
        selectedIndex="@{selectedSlider.value}"
        itemRenderer="{stuffRenderer}">

</s:List>

selectedIndex与HSlider相关联,但这不是问题。我的问题是我想从列表中自动选择某个“首选”元素(最初只是为了引导用户)。

我尝试在creationComplete事件中执行此操作,但我的数据尚未显示...设置selectedIndex无效...现在为时尚早。

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

private function findAllUsers_resultHandler(e:ResultEvent):void
{
    list.dataProvider = new ArrayCollection(e.result as Array);
    if(firstTry)
    {
        list.selectedIndex = 0;
        firstTry = false;
    }
}

答案 1 :(得分:2)

spark.components.List在其类层次结构中有spark.components.SkinnableDataContainer,只要dataProvider发生更改,就会调度dataProviderChanged事件。遗憾的是,[Event]中没有允许在MXML中使用此事件的SkinnableDataContainer元数据。因此,您需要创建自己的自定义组件,扩展List

package
{
    import spark.components.List;

    [Event(name="dataProviderChanged", type="flash.events.Event")]
    public class MyList extends List
    {
        public function MyList()
        {
            super();
        }
    }
}

通过使用自定义组件,您可以为dataProviderChanged添加事件监听器并相应地更新selectedIndex

<ns1:MyList id="list" dataProvider="{model.stuff}" width="100%" height="100%"
        dataProviderChanged="selectedIndex = selectedSlider.value"
        selectedIndex="@{selectedSlider.value}"
        itemRenderer="{stuffRenderer}">
</ns1:MyList>

BTW:这也适用于其他基于List的组件(例如DropDownList)。

答案 2 :(得分:1)

我相信如果您只是将滑块的初始值设置为您想要在开头选择的索引,它应该可以工作。 像这样:

<s:List dataProvider="{yourData}" selectedIndex="{hSlider.value}" /> <s:HSlider id="hSlider" minimum="0" maximum="{yourData.length - 1}" stepSize="1" value="theIndexYouWantAsInitial" liveDragging="true" />

那应该有用。 HTH FTQuest