Добавить «Новый элемент ярлык» в Spark ComboBox - PullRequest
0 голосов
/ 15 июля 2011

У меня есть пользовательский Spark ComboBox, который содержит список элементов.Я хочу добавить новый элемент в ComboBox с указанием текста «Добавить новый элемент», который при выборе всплывающего окна, чтобы сделать некоторые операции.

Я достиг этого, создав новый объект того же типа сущностей в поставщике данных, с LabelField нового объекта, имеющего текст «Добавить новый элемент».Я переопределил метод set dataProvider и в пользовательском поле со списком.

Но это добавляет значения в фактический список, который связан с DataProvider.Список используется в бизнес логике.Поэтому я не хочу, чтобы это произошло.У меня много классов сущностей.Я не мог изменить все объекты.

Все, что я хочу, - это добиться того же функционала в моем пользовательском компоненте без изменения другого кода.Я также пытался создать новый экземпляр dataProvier, но заметил, что привязка List и dataprovider теряется при создании нового экземпляра.

Пожалуйста, помогите. !!

Отредактировано:

ExtendedComboBox.as

package components

{import flash.utils.getDefinitionByName;

import mx.collections.ArrayCollection;
import mx.collections.IList;

import spark.components.ComboBox;
import spark.events.DropDownEvent;

public class ExtendedComboBox extends ComboBox
{

    private var _addItem:Boolean = false;
    private var _addItemLabel:String = "Create New Item" ;
    private var _dropDownClass:String = null ;
    private var originalDP:IList ;
    private var dpEdited:Boolean = false;

    public function ExtendedComboBox()
    {
        super();
        this.addItem = true;
        this.addEventListener(DropDownEvent.CLOSE, dropDownCloseEventListner );
        this.addEventListener(DropDownEvent.OPEN, openDropDownEvent );
    }

    public function get dropDownClass():String
    {
        return _dropDownClass;
    }

    public function set dropDownClass(value:String):void
    {
        _dropDownClass = value;
    }

    public function get addItemLabel():String
    {
        return _addItemLabel;
    }

    public function set addItemLabel(value:String):void
    {
        _addItemLabel = value;
    }

    public function get addItem():Boolean
    {
        return _addItem;
    }

    public function set addItem(value:Boolean):void
    {
        _addItem = value;
    }

    private function dropDownCloseEventListner(event:DropDownEvent):void{

    }

    protected function openDropDownEvent(event:DropDownEvent):void{
        if(addItem)
        {
            //  if(value) value = new ArrayCollection();
            var value:IList  ; 
            if(originalDP == null)  value = new ArrayCollection ;
            else value = new ArrayCollection( originalDP.toArray() ) ;
            var tempObj:Object;
            var createItemPresent:Boolean =false ;
            if(dropDownClass != null)           
            {
                var TempClass = flash.utils.getDefinitionByName(dropDownClass) as Class;
                tempObj = new TempClass();
                if(value.length >0)
                {
                //  trace(value.getChildAt(0)[this.labelField]) ;
                    if(value.getItemAt(0)[this.labelField] == addItemLabel)
                        createItemPresent = true ;
                }
                if(!createItemPresent)
                {
                    tempObj[this.labelField] = addItemLabel ;
                    var sort = (value as ArrayCollection).sort ;
                    value.addItemAt(tempObj, 0);
                    (value as ArrayCollection).sort = sort ;
                    dpEdited = true;
                }
            }
        }
        super.dataProvider = value;
    }

    override public function set dataProvider(value:IList):void{
        if(!dpEdited)
        {
            originalDP = value;
            dpEdited = true;
        }

        /*if(addItem)
        {
        //  if(value) value = new ArrayCollection();
            var tempObj:Object;
            var createItemPresent:Boolean =false ;
            if(dropDownClass != null)           
            {
                var TempClass = flash.utils.getDefinitionByName(dropDownClass) as Class;
                tempObj = new TempClass();
                if(value.length >0)
                {
                    if(value.getItemIndex(0)[this.labelField] == addItemLabel)
                        createItemPresent = true ;
                }
                if(!createItemPresent)
                {
                tempObj[this.labelField] = addItemLabel ;
                var sort = (value as ArrayCollection).sort ;
                value.addItemAt(tempObj, 0);
                (value as ArrayCollection).sort = sort ;
                }
            }
        }*/
        super.dataProvider = value;
    }
}

}

MyEntityObj.as

package entity

{открытый класс MyEntityObj {личное имя _ _: String;частный переменный: int;private var _company: String;

    public function MyEntityObj()
    {
    }

    public function get company():String
    {
        return _company;
    }

    public function set company(value:String):void
    {
        _company = value;
    }

    public function get age():int
    {
        return _age;
    }

    public function set age(value:int):void
    {
        _age = value;
    }

    public function get name():String
    {
        return _name;
    }

    public function set name(value:String):void
    {
        _name = value;
    }

}

}

и пример реализации - ComboImpl.mxml

<?xml version="1.0" encoding="utf-8"?>

        import mx.collections.ArrayCollection;
        import mx.events.CollectionEvent;
        import mx.events.FlexEvent;

        [Bindable]
        private var samplDP:ArrayCollection;

        protected function application1_initializeHandler(event:FlexEvent):void
        {
            samplDP = new ArrayCollection ;
            samplDP.addEventListener(CollectionEvent.COLLECTION_CHANGE, changeHandlerFunc );
            var sampVO:MyEntityObj;
            for(var i:int = 0; i<5;i++)
            {
                sampVO = new MyEntityObj;
                sampVO.name = "Name " + i;
                sampVO.age = i;
                sampVO.company = "Company " + i;
                samplDP.addItem(sampVO);
            }
        }

        protected function changeHandlerFunc(event:CollectionEvent):void{
            var nameList:String = "" ;
            for each(var myObj:* in samplDP)
            {
                nameList += myObj.name + ", " ;
            }
            changeHandler.text = nameList ;
        }

    ]]>
</fx:Script>
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:VGroup>
    <s:Label id="changeHandler" />  
    <components:ExtendedComboBox dataProvider="{samplDP}" labelField="name" addItem="true" dropDownClass="entity.MyEntityObj" addItemLabel="Create Sample" />
</s:VGroup>

Как отмечено в методе set DataProvider Overridden и в событиях DropDownClose, добавление нового элемента напрямую влияет на исходный список.Я не хочу, чтобы это произошло.

Обратите внимание, что это просто пример реализации.Создание компонента в моем проекте фактически происходит в классе сценария действия динамически.

Пожалуйста, помогите. !!

1 Ответ

0 голосов
/ 15 июля 2011

Это звучит для меня как:

Вам придется расширить ComboBox (если вы детализируете, как он реализован, возможно, DataGroup), чтобы включить ваш дополнительный элемент «Добавить новый элемент» без его нахождения в dataProvider.

Я ожидаю, что это будет очень сложно, но я не проверял код для этой цели.

...