Есть ли способ выбрать компонент MXML во время создания пользовательского интерфейса на основе значения поля?

У меня есть гибкий пользовательский интерфейс MXML, который создает набор переключателей с использованием компонента Repeater:

<mx:Repeater id="radios"
             dataProvider="{_lists.(@id == _question.single.@response_list).group.listItem}">
    <mx:RadioButton groupName="responses"
                    label="{radios.currentItem.@text}"
                    data="{radios.currentItem.@level}"/>
</mx:Repeater>

Что я хочу сделать, так это выбрать компонент внутри повторителя - RadioButton в этом примере - на основе значения свойства radios.currentItem: если значение currentItem равно "foo", например, я хочу Button там, или если это "планка" хочу RadioButton. Можно ли выполнить такое условное построение в компоненте MXML, или для этого мне нужно вернуться к ActionScript?

Я думаю о чем-то в этом роде:

<mx:Repeater id="r" dataProvider="{list}">
    <mx:If test="{r.currentItem.@type == 'radio'}">
        <mx:RadioButton label="{r.currentItem.@text}" />
    </mx:If>
    <mx:If test="{r.currentItem.@type == 'specify'}">
        <custom:Specify label="{r.currentItem.@text}" />
    </mx:If>
</mx:Repeater>

person Chris R    schedule 17.07.2009    source источник


Ответы (3)


Правильный (и действительно единственно разумный) способ сделать это - использовать простой цикл for и ActionScript:

for each (var o:Object in yourDataProvider)
{
    if (o.someProperty)
    {
        var rb:RadioButton = new RadioButton();
        yourContainer.addChild(rb);
    }   
    else
    {
        var s:Specify = new Specify();
        yourContainer.addChild(s);
    }
}

Вы могли бы сделать так, как предлагает Слэшник, и просто добавить оба компонента с каждой итерацией Repeater, переключая их отображение на основе какого-либо теста (в этом случае я бы, вероятно, предложил также включить атрибут includeInLayout), но вы бы из-за этого ваш список отображения раздувается, и он не масштабируется - в конце концов, вы все равно делаете это в ActionScript.

person Christian Nunciato    schedule 17.07.2009

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

<mx:Repeater id="r" dataProvider="{list}">
   <mx:RadioButton label="{r.currentItem.@text}" visible="{r.currentItem.@type == 'radio'}" />
   <custom:Specify label="{r.currentItem.@text}" visible="{r.currentItem.@type == 'specify'}" />
</mx:Repeater>

См. http://www.firemoss.com/post.cfm/Powerful-MXML-Bindings-with-Ternary--Operators для получения дополнительных примеров.

person slashnick    schedule 17.07.2009

Я бы использовал для этого AS3. Я считаю, что лучше всего использовать mxml для отображения и AS3 для логики ... аналогично тому, как в .Net у вас есть код программной части

person Chris Klepeis    schedule 17.07.2009
comment
Итак, я застрял в создании компонентов вручную, а это значит, что мне тоже нужно вручную обрабатывать все привязки данных, верно? Как лучше всего этого добиться? - person Chris R; 18.07.2009