Flex: Combobox теряет фокус при обновлении поставщика данных? - PullRequest
1 голос
/ 01 мая 2009

Кажется, что ComboBox теряет свой выбранный элемент после обновления dataProvider, даже если тот же выбранный элемент все еще находится в dataProvider. Они конвертируются обратно в первый выбранный элемент. Есть ли способ предотвратить это? Так что, если тот же объект находится в dataProvider, он сохраняет выбранный тот же объект и возвращается к первому индексу, только если выбранный объект отсутствует в обновленном dataProvider?

Спасибо!

Ответы [ 2 ]

1 голос
/ 01 мая 2009

Если ComboBox теряет выбранный элемент, это означает, что dataProvider не обновляется - он заменяется. Если вы связываете ComboBox с ArrayCollection, а затем добавляете элемент в AC, ComboBox обновляется без потери его selectedItem.

Иногда вам нужно заменить dataProvider, и в этих случаях вы должны прослушать событие updateComplete и сбросить selectedItem. Вы можете попробовать этот код:

<mx:Script>
    <![CDATA[
        import mx.controls.ComboBox;
        import mx.events.ListEvent;
        import mx.events.FlexEvent;
        import mx.collections.ArrayCollection;

        [Bindable]
        private var dp:ArrayCollection = new ArrayCollection(["Item 1", "Item 2", "Item 3"]);

        private var selectedItem:*;
        private var dataProvider:*;

        private function onChange(event:ListEvent):void {
            selectedItem = (event.currentTarget as ComboBox).selectedItem;
        }
        private function onUpdateComplete(event:FlexEvent):void {
            trace(event);
            var cb:ComboBox = event.currentTarget as ComboBox;
            if(dataProvider == null || cb.dataProvider != dataProvider) {
                if(selectedItem != null && cb.selectedItem != selectedItem) cb.selectedItem = selectedItem;
                if(cb.selectedIndex < 0) cb.selectedIndex = 0;
                dataProvider = cb.dataProvider;
            }
        }

        private function extendDP():void {
            dp.addItem("Item " + (dp.length +1));
            var ac:ArrayCollection = new ArrayCollection(dp.source);
            dp = ac;
        }

        private function reduceDP():void {
            dp.removeItemAt(dp.length -1);
            var ac:ArrayCollection = new ArrayCollection(dp.source);
            dp = ac;
        }
    ]]>
</mx:Script>

<mx:VBox>
    <mx:ComboBox dataProvider="{dp}" change="onChange(event)" updateComplete="onUpdateComplete(event)" />
    <mx:Button label="Extend dp" click="extendDP()" />
    <mx:Button label="Reduce dp" click="reduceDP()" />
</mx:VBox>

Создает ComboBox и связывает его с ArrayCollection. Две кнопки добавляют и удаляют элементы из коллекции.

0 голосов
/ 01 мая 2009

Я смог расширить ComboBox с помощью этого класса, который просто ищет выбранную метку и сравнивает с метками из нового dataProvider. Кажется, работает, хотя вроде как ad-hoc. Я надеялся на масштабируемое решение.

package
{
    import mx.controls.ComboBox;
    import mx.collections.ArrayCollection;

    public class SelectionKeepingComboBox extends ComboBox
    {
        public function SelectionKeepingComboBox()
        {
            super();
        }

        override public function set dataProvider(value:Object):void
        {
            var curSelectedLabel:String;
            if(this.selectedItem)
            {
                curSelectedLabel = this.selectedLabel;
            }

            super.dataProvider = value;

            if(curSelectedLabel == null)
            {
                return;
            }

            var dp:Array;
            if(this.dataProvider is ArrayCollection)
            {
                dp = this.dataProvider.toArray();
            }
            else
            {
                dp = this.dataProvider as Array;
            }
            for(var i:uint = 0; i<dp.length; i++)
            {
                var obj:Object = dp[i];
                var dpLabel:String = obj.label;
                if(dpLabel == curSelectedLabel)
                {
                    this.selectedItem = obj;
                }   
            }
        }

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