как сделать скин dropdownlist с другим полем arraycollection - PullRequest
1 голос
/ 16 февраля 2012

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

кейс 1

var collection:ArrayCollection = new ArrayCollection(["foo", "foo2", "foo3"]);

А иногда массив массивов заполняется другим методом, имеет несколько полей:

Дело 2

var collection:ArrayCollection = new ArrayCollection (
                [{DESC:"foo", ID:"0"},
                {DESC:"foo1", ID:"1"},
                {DESC:"foo2",ID:"2"},
                {DESC:"foo3", ID:"3"}
                ]
                );

В этом случае labelField имеет значение Desc.

Итак, мне нравится пользовательский DDL, и я создаю обложку с itemrender для части метки:

    <?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
                xmlns:s="library://ns.adobe.com/flex/spark" 
                xmlns:mx="library://ns.adobe.com/flex/mx" 
                autoDrawBackground="true">


    <s:states>
        <s:State name="normal"/>
        <s:State name="hovered"/>
        <s:State name="selected"/>
    </s:states>
    <s:Label text="{data}" backgroundColor.selected="#1B5790" color.selected="white"
             backgroundColor.hovered="#E1DFD2" color.hovered="white" fontWeight.hovered="bold"
             width="100%" height="25" paddingLeft="5" paddingTop="5" styleName="myLabelBlack" toolTip="{data}"/>

</s:ItemRenderer>

Этот метод хорошо работает с примером 1 (arListBank), но отображает [Object object] в случае 2.

Так что моя цель - иметь одного и того же предметника в обоих случаях.

Не могли бы вы мне помочь?

Спасибо

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012

Я собираюсь сделать предположение, что невозможно изменить вашу структуру данных на этом этапе и перейти оттуда.Помните, что элемент данных, передаваемый itemRenderer, представляет отдельный элемент в вашем dataProvider.В первом случае это будет строка, например:

foo

Во втором случае это будет объект, подобный следующему:

{DESC:"foo", ID:"0"}

Итак, вВ первом случае ваша метка отображается правильно, потому что это строка.Во втором случае Flex запустит метод toString() для вашего объекта, и он вернет прозвище [Object object], которое вы видите.

Чтобы сделать это в одном itemRenderer, вам нужно обновить, как текст установлен на вашем ярлыке.Шаги выглядят следующим образом:

1) Удалите атрибут связанного текста из метки 2) Прослушайте событие dataChange в компоненте ItemRenderer 3) В обработчике события dataChange проверьте, какие типы данных у вас естьи использовать его для условной установки значения текста в метке в зависимости от типа данных.

Это псевдо-код, но это суть

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

<fx:Script>
   protected function onDataChange(event:Event):void{
       if(data is Object){
         labelDisplay.text = data.DESC;
       } else {
         labelDisplay.text = data;
      }
   }
</fx:Script>
<s:states>
    <s:State name="normal"/>
    <s:State name="hovered"/>
    <s:State name="selected"/>
</s:states>
<s:Label id="labelDisplay" backgroundColor.selected="#1B5790" color.selected="white"
         backgroundColor.hovered="#E1DFD2" color.hovered="white" fontWeight.hovered="bold"
         width="100%" height="25" paddingLeft="5" paddingTop="5" styleName="myLabelBlack" toolTip="{data}"/>

[Используйте тот же подход, чтобы установить подсказку]

Однако есть много способов сделать это по-другому.Вы можете создать суперкласс с базовыми компонентами и расширить его, переопределив обработчик события onDataChange для соответствующих типов данных.Тогда у вас будет три компонента (суперкомпонент, данные как строковый компонент и данные как компонент объекта), но вы будете повторно использовать большую часть кода.

Если у вас есть явный объекттипы, определенные для вашего второго dataProvider, просто реализуйте пользовательский метод toString (), чтобы вернуть описание и использовать определенный вами itemRenderer.

0 голосов
/ 16 февраля 2012

Существует довольно хороший способ изменить "представления" рендерера ЗДЕСЬ Обязательно прочитайте комментарии.

...