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个问题:

  1. 当我从_list.dataProvider,使用绑定组合框更新删除“儿童()”,但我需要阅读的孩子,所以绑定失败。

  2. 尽管模型被定义为可绑定,但文本从不更新。

为什么绑定到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 
    } 
}