Flex将组合框绑定到XML儿童
问题描述:
我遇到了一些与我的数据绑定有关的问题,我希望有人能帮助我。Flex将组合框绑定到XML儿童
我已经创建了一个非常简单的例子,我正在尝试实现,您可以在下面看到。
<?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,视图不更新。存在
2个问题:
当我从_list.dataProvider,使用绑定组合框更新删除“儿童()”,但我需要阅读的孩子,所以绑定失败。
尽管模型被定义为可绑定,但文本从不更新。
为什么绑定到children()?
我已经创建了一个自定义组件,它将从其父组件接收不同的数据集。在这个自定义组件中有一个需要显示数据子项的组合框。如果我无法绑定到孩子,我可能必须硬编码每个使用它的独特组件。
例如,一旦数据的实例可以是:
<locations>
<option title="Hampshire"/>
<option title="Warwickshire"/>
<option title="Yorkshire"/>
</locations>
另一种可能是:
<stock>
<option title="Hammer"/>
<option title="Drill"/>
<option title="Spanner"/>
</stock>
因此,重要的是我绑定到儿童()。
这是可能的,如果没有,是否有人知道我将如何解决这个问题?
任何意见,将不胜感激。
答
这是你应该使用getters和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
}
}