繁体   English   中英

Flex将ComboBox绑定到XML子级

[英]Flex Binding ComboBox to XML children

我的数据绑定存在一些问题,希望有人可以帮助我。

我为要实现的目标创建了一个非常简单的示例,您可以在下面看到。

    <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" horizontalAlign="center" verticalAlign="middle" initialize="init()">

    <!-- Controller -->
    <mx:Script>
        <![CDATA[
                import mx.collections.XMLListCollection;
                import mx.binding.utils.BindingUtils;

                protected var _tally:Number = 3;

                //RAW XML
                [Bindable]protected var _model:XML = new XML("<model><option title='Option 1'/> <option title='Option 2'/> <option title='Option 3'/> </model>");

                //This should bind the children to the XMLLList BUT DOES NOT
                [Bindable]protected var _list:XMLList = new XMLList(_model.children());

                //This Binds the _list to the _collection
                [Bindable]protected var _collection:XMLListCollection = new XMLListCollection(_list);


                //ADDS NEW DATA TO MODEL
                protected function updateModel():void 
                {
                    _tally++; 
                    _model.appendChild(new XML("<option title='Option " + _tally + "'/>"))
                    trace(_model)
                }

        ]]>
    </mx:Script>

    <!-- View -->
    <mx:Panel title="Combo Binding Test" >
        <mx:ComboBox id="_combo" width="100%" labelField="@title" dataProvider="{_collection}" />
        <mx:Text id="_text" height="100" width="300" selectable="false" text="{_model}" />
        <mx:ApplicationControlBar width="100%" dock="true">
            <mx:Button label="Update Model" click="updateModel()" />
        </mx:ApplicationControlBar>
    </mx:Panel>

</mx:Application>

(我希望它格式化还可以!)

预览时,可以看到绑定已将数据放入正确的位置,但是当我使用更多数据更新XML时,视图不会更新。

存在两个问题:

  1. 当我从_list.dataProvider删除'children()'时,ComboBox使用绑定进行更新,但是我需要读取子代,因此绑定失败。

  2. 尽管模型定义为可绑定的,但文本永远不会更新。

为什么要绑定到children()?

我创建了一个自定义组件,该组件将从其父级接收不同的数据集。 这个自定义组件中包含一个ComboBox,它需要显示数据的子代。 如果无法绑定到子项,则可能需要在每个实例使用后对其进行硬编码。

例如,一次数据实例可以是:

<locations>
<option title="Hampshire"/>
<option title="Warwickshire"/>
<option title="Yorkshire"/>
</locations> 

另一个可能是:

<stock>
<option title="Hammer"/>
<option title="Drill"/>
<option title="Spanner"/>
</stock>

因此,对我而言,绑定到children()很重要。

这是否可能,如果没有,有人知道我将如何解决这个问题?

任何对此的建议将不胜感激。

在这里应该使用getter和setter。 例如:

private var _list:XMLList;

[Bindable]
public function get list() : XMLList {
  return _list;
}

public function set list(value:XMLList) : void {
  _list = value;
  // also can try list.refresh() here if this doesn't do the job
}

然后在commitProperties(或creationComplete或其他任何东西)中执行以下操作:

override protected function commitProperties() : void {
  super.commitProperties();
  if (_model && _model.children.length > 0) {
    list = _model.children(); // or use E4X as _model..option
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM