Почему SelectedIndex не будет работать каждый раз во Flex 4? - PullRequest
1 голос
/ 31 октября 2010

В следующем рабочем примере выбранный индекс списка должен сбрасываться в 0 при каждом изменении текстового поля.

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

<?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" minWidth="955" minHeight="600">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayList;
            import mx.core.UIComponent;
            import mx.events.FlexEvent;

            import spark.effects.Scale;
            import spark.events.TextOperationEvent;

            [Bindable]
            public var items : ArrayList;

            protected function textinput1_changeHandler(event:TextOperationEvent):void
            {
                items = new ArrayList(input.text.split(" "));
                list.selectedIndex = 0;
            }
        ]]>
    </fx:Script>
    <s:TextInput x="165" y="124" change="textinput1_changeHandler(event)" id="input" text="a few words"/>
    <s:List x="165" y="184" width="433" height="291" dataProvider="{items}" id="list"></s:List>
</s:Application>

Ответы [ 4 ]

0 голосов
/ 03 мая 2011

Причиной того, что событие создается только при изменениях индекса, проверьте список базы setselectedindex;

Исправление до изменения selectedindex на 0 состоит в том, чтобы сначала изменить его на -1, а затем на 0.

/**
 *  @private
 *  Used internally to specify whether the selectedIndex changed programmatically or due to 
 *  user interaction. 
 * 
 *  @param dispatchChangeEvent if true, the component will dispatch a "change" event if the
 *  value has changed. Otherwise, it will dispatch a "valueCommit" event. 
 */
mx_internal function setSelectedIndex(value:int, dispatchChangeEvent:Boolean = false):void
{
    if (value == selectedIndex)
        return;

    if (dispatchChangeEvent)
        dispatchChangeAfterSelection = dispatchChangeEvent;
    _proposedSelectedIndex = value;
    invalidateProperties();
}
0 голосов
/ 11 апреля 2011

Проблема в том, что ваш список еще не отображается, когда вы устанавливаете выбранный индекс.

Изменение метода textinput1_changeHandler решит эту проблему:

protected function textinput1_changeHandler(event:TextOperationEvent):void
{
    items = new ArrayList(input.text.split(" "));
    callLater(function():void{list.selectedIndex = 0;});
}
0 голосов
/ 11 апреля 2011

Сначала добавьте в свою функцию обновление поставщика данных, чтобы он зафиксировал изменения:

protected function textinput1_changeHandler(event:TextOperationEvent):void
{
     items = new ArrayList(input.text.split(" "));
     (list.dataProvider as ArrayCollection).refresh();
     list.selectedIndex = 0;
}
0 голосов
/ 31 октября 2010

Сначала вы должны проверить функцию "String.split".В ней несколько ошибок, я их не помню.Попробуйте это в такой последовательности, как «» или «бла» (пробел в конце).

Также вам следует подождать, пока список фактически не обновится.Изменение свойства привязки запускает только некоторые события, но фактически не меняет список (AFAIK).Просто гугл лист событий.Также вы можете попытаться переопределить установщик List «dataProvider».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...