有没有办法根据字段的值在UI构建时选择MXML组件?

时间:2009-07-17 20:00:14

标签: flex flex3 adobe mxml

我有一个flex 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的值1}}是“foo”,例如,我想要Button,或者如果它是“bar”我想要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 个答案:

答案 0 :(得分:4)

正确(并且真正唯一合理)的方法是使用简单的'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);
    }
}

你可以像slashnick建议那样做,只需在Repeater的每次迭代中添加两个组件,根据某种类型的测试切换它们的显示(在这种情况下,我可能会建议将includeInLayout属性包含为好吧),但你这样做会让你的显示列表膨胀,并且它不会扩展 - 最终,你最终还是会在ActionScript中完成它。

答案 1 :(得分:2)

我认为你必须在任何条件下使用动作脚本。 mxml中似乎不存在条件语句。虽然您可以包含这两个元素并使用内联来设置可见状态。

<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

答案 2 :(得分:0)

我会使用AS3。我的观点是最好使用mxml作为显示器,使用AS3作为逻辑......类似于.Net中你有代码隐藏的方式