Есть ли способ выбрать компонент MXML во время создания пользовательского интерфейса на основе значения поля? - PullRequest
1 голос
/ 18 июля 2009

У меня есть гибкий 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>

Ответы [ 3 ]

4 голосов
/ 18 июля 2009

Правильный (и действительно единственный разумный) способ сделать это - использовать простой цикл '1001 * и 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);
    }
}

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

2 голосов
/ 18 июля 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 для дополнительных примеров.

0 голосов
/ 18 июля 2009

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

...