В Flex DropDownList есть ли способ связать со свойством элемента в dataProvider? - PullRequest
0 голосов
/ 02 августа 2010

У меня следующий код.

<s:DropDownList dataProvider={_dataProvider}/>
<fx:Script>
   private var _dataProvider:ArrayCollection = new ArrayCollection([{label:"one", data:1}, {label:"two", data:2}]);
</fx:Script>

Я хочу связать свойство данных selectedItem в DropDownList.Есть ли способ сделать это?

Ответы [ 4 ]

2 голосов
/ 14 апреля 2011

Не уверен, что это другой подход к вопросу ... но я создал собственный выпадающий список и связал selectedItem с входящими изменениями. Когда значение моих желаемых данных изменится, оно вызовет раскрывающийся список, чтобы изменить его выбор.

DropDownListBindable.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:DropDownList xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx">
    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;
            [Bindable] public var valueField:String = "";

            override public function set selectedItem(value:*):void{
                try{
                    for(var i:uint=0;i<this.dataProvider.length;i++){
                        if(this.dataProvider[i][this.valueField]==value){   
                            this.selectedIndex=i;
                            break;                      
                        }else{
                            this.selectedIndex=-1;
                        }
                    }
                }catch(e:Error){}
            }
        ]]>
    </fx:Script>
</s:DropDownList>

В приложении я импортирую пользовательский выпадающий список и связываю поле значений с тем, что нужно связать ... в вашем случае это «данные». Я также создал объект под названием «mydata» для выпадающего списка для прослушивания изменений. При изменении mydata список тоже будет. Я добавил кнопку, чтобы продемонстрировать, как меняется список.

main.mxml

    <?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" 
    xmlns:components="com.components.*">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;          
            [Bindable] private var myData:Object = new Object();
            [Bindable] private var _dataProvider:ArrayCollection = new ArrayCollection([{label:"one", data:1}, {label:"two", data:2}]);

        ]]>
    </fx:Script>
    <s:HGroup>
        <components:DropDownListBindable
            dataProvider="{_dataProvider}"
            prompt="--select one--"    
            selectedItem="{this.myData}" 
            id="ddl"                 
            valueField="data"                
            labelField="label"/>
        <s:Button label="change datafield" click="this.myData=1"/>
    </s:HGroup>
</s:Application>
1 голос
/ 03 августа 2010
<s:DropDownList id="ddl" dataProvider="{_dataProvider}"/>
<s:Label text="{ddl.selectedItem.data.toString()}"/>
1 голос
/ 02 августа 2010

Я почти уверен, что ответ - нет, но просто для ясности;Я в замешательстве.

Если ваш dataProvider содержит такие объекты:

{label:"one", data:1}

Во-первых, этот синтаксис создаст универсальный объект без настройки.Если ни одно из свойств этого объекта не определено явно, ни одно из них не может реализовать тег метаданных Bindable, и, следовательно, при использовании в качестве источника для привязки данных цель никогда не обновится.

Second off, даже еслиВы создали свой собственный неуниверсальный объект со связываемыми свойствами, обычно привязка не проходит несколько уровней вглубь свойств объекта массива.

selectedItem будет указывать на объект, подобный находящемуся в _dataProviderили, возможно, null, основанный на взаимодействии пользователя с dropDownList.Привязка selectedItem к свойству внутри элемента не имеет смысла;потому что вы сравниваете литерал с объектом, и ничего не будет выделено.

Мне непонятно, не глядя, что происходит в DropDownList, когда вы пытаетесь установить selectedItem для элемента, не входящего в ваш dataProvider.Я предполагаю, что это сбрасывает выбор, хотя.

Если вы сможете подробнее рассказать о том, чего именно вы пытаетесь достичь, мы сможем помочь вам больше.

0 голосов
/ 04 декабря 2010

Да. Вы можете сделать это. Это довольно просто, на самом деле. Я делаю это все время:

<s:DropDownList dataProvider="{_dataProvider}" selectedItem="@{_selectedItem}" />

С ActionScript, который выглядит следующим образом:

private var _dataProvider:ArrayCollection = new ArrayCollection([{label:"one", data:1}, {label:"two", data:2}]);
[Bindable] private var _selectedItem;

Каждый раз, когда пользователь выбирает элемент в раскрывающемся списке, устанавливается _selectedItem.

...