Расширение DropDownList для включения дополнительной опции - PullRequest
0 голосов
/ 27 марта 2011

Я хочу расширить элемент управления DropDownList, чтобы включить параметр для создания или редактирования параметров. Например; для списка проектов в раскрывающемся списке будет другой вариант с надписью «Создать новый проект ...» или «Редактировать проекты ...», и это будет последний параметр в списке. Когда пользователь выбирает эту опцию, selectedIndex или selectedItem не изменятся, и будет выполнено соответствующее действие (например, всплывающее окно). Это будет удобный способ для конечного пользователя.

Теперь я хочу, чтобы это работало независимо от контекста, и класс должен использоваться повторно. Пользователь будет указывать только optionText и optionFunction, чтобы решить эту проблему. Основная структура класса выглядит следующим образом:

public class OptiveDropDownList extends DropDownList
{
    private var _enableOption:Boolean;
    private var _optionText:String;
    private var _originalDataProvider:IList;
    [Bindable] public var optionFunction:Function;

    public function OptiveDropDownList()
    {
        super();
    }

    public function set optionText(value:String):void
    {
        _optionText = value;
        dataProvider = _originalDataProvider;
    }

    public function set enableOption(value:Boolean):void
    {
        _enableOption = value;
        dataProvider = _originalDataProvider;
    }

    public override function set dataProvider(value:IList):void
    {
        _originalDataProvider = value;
        var dp:IList = null;
        if(!value){
            dp=new ArrayCollection(value.toArray());
            if(_enableOption){
                var opt:Object=new Object();
                opt[labelField]=_optionText;
                dp.addItem(opt);
            }
        }
        super.dataProvider = dp;
    }

    [Bindable]
    public override function get dataProvider():IList
    {
        return _originalDataProvider;
    }
}

Я надеюсь, что мой код понятен, я добавляю дополнительный объект к провайдеру данных для этой опции. Имена полей говорят сами за себя.

Теперь мой вопрос: как узнать, изменились ли элементы поставщика данных? Какие функции я должен переопределить и как это сделать. Я пытался использовать ChangeWatcher для просмотра свойства длины поставщика данных, но он не работает, если изменился только объект в поставщике данных. Мне нужно зафиксировать эти изменения и обновить вид.

Мне также нужно захватить функцию выбора и вызова optionFunction, предотвращая действие по умолчанию, чтобы не выдавать ошибку индекса за пределами границ.

Спасибо заранее.

1 Ответ

1 голос
/ 27 марта 2011

Просто добавьте прослушиватель событий в исходный dataProvider.Все реализации IList должны отправлять CollectionEvent.COLLECTION_CHANGE при изменении списка (например, добавить, удалить или когда существующий объект в списке был изменен).В вашем обработчике событий вы можете соответствующим образом обновить dataProvider DropDownList.

Переопределив метод mx_internal setSelectedIndex(), вы можете настроить выбор в соответствии со своими пожеланиями.Взгляните на сообщение в блоге " Отключить выделение для некоторых элементов в списке искр " для вдохновения.

...