PDA

Просмотр полной версии : DataProvider в MXML и AS3 в чем разница


Захаров
23.06.2008, 16:46
Ниже приведен пример загрузка XML данных в грид и комбобокс объявленные в MXML нотации и грид добавленный программным способом
Вопрос состоит в следующем что нужно дописать к программируемому гриду что бы он вел себя так же как и объявленные MXML нотацией при изменении данных в DATAPROVIDER!

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init();">
<mx:Script>
<![CDATA[
import mx.controls.dataGridClasses.DataGridColumn;
import mx.controls.DataGrid;
[Bindable]
private var xxx:XML = new XML()
private var dg:DataGrid = new DataGrid()
private function init():void
{

var dgcolumns:Array = new Array();

var dgcolumn1:DataGridColumn = new DataGridColumn();

dgcolumn1.dataField="@id";
dgcolumns.push(dgcolumn1)
var dgcolumn2:DataGridColumn = new DataGridColumn();
dgcolumn2.dataField="@name";
dgcolumns.push(dgcolumn2)
var dgcolumn3:DataGridColumn = new DataGridColumn();
dgcolumn3.dataField="@desc";
dgcolumns.push(dgcolumn3)
dg.columns = dgcolumns;
dg.width=200
dg.height=200
this.addChild(dg);
dg.dataProvider = this.xxx.item;


}
private function f(evt:Event):void
{

this.xxx = XML ('<o><item id="1" name="name1" desc="ffffffff" /><item id="1" name="name2" desc="ffffffff" /><item id="1" name="name1" desc="ffffffff" /><item id="1" name="name2" desc="ffffffff" /></o>');

}
private function f_2(evt:Event):void
{

this.xxx = XML ('<o><item id="1" name="name1" desc="ffffffff" /><item id="1" name="name2" desc="ffffffff" /><item id="1" name="name1" desc="ffffffff" /><item id="1" name="name2" desc="ffffffff" /></o>');
dg.dataProvider = this.xxx.item;// почему приходится добавлять эту строчку? и что дописать что бы было как внотации MXML?
}
]]>
</mx:Script>
<mx:Model id="md1">
<o>

<item id="1" name="name1" desc="ffffffff" />
<item id="1" name="name2" desc="ffffffff" />
<item id="1" name="name1" desc="ffffffff" />
<item id="1" name="name2" desc="ffffffff" />
</o>
</mx:Model>

<mx:ComboBox dataProvider="{xxx.item}" labelField="@name"></mx:ComboBox>


<mx:DataGrid dataProvider="{xxx.item}">
<mx:columns>
<mx:DataGridColumn headerText="Column 1" dataField="@id"/>
<mx:DataGridColumn headerText="Column 2" dataField="@name"/>
<mx:DataGridColumn headerText="Column 3" dataField="@desc"/>
</mx:columns>
</mx:DataGrid>
<mx:Button click="f(event)" label="загрузка обычная" />
<mx:Button click="f_2(event)" label="загрузка для программируемого грида"/>



</mx:Application>

Borman2000
25.06.2008, 22:26
Так будет работать с обоими гридами. Но вот почему не работает твой вариант...
<mx:Binding
source="xxx.item"
destination="dg.dataProvider"/>


Может проблема в том, что MXML и событие для датабиндинга формируется на этапе компиляции, а программный грид формируется в рантайме, т.е. для него нету события.

Можно попробовать поюзать BindingUtils.bindProperty

zlatko
28.06.2008, 14:32
Если использовать вместо XML непосредственно XMLList который будет источником, то все образуеться :quiet:

Вот шаблончик :

[Bindable]
public var xxx:XMLList = new XMLList();

private function init():void
{
***
BindingUtils.bindProperty(dg, "dataProvider", this, "xxx");

this.addChild(dg);
}

private function f(evt:Event):void
{
this.xxx = XMLList('<item id="1" name="name1" desc="ffffffff" /><item id="1" name="name2" desc="ffffffff" /><item id="1" name="name1" desc="ffffffff" /><item id="1" name="name2" desc="ffffffff" />');
}

<mx:ComboBox dataProvider="{xxx}" labelField="@name"/>

<mx:DataGrid dataProvider="{xxx}">
***
</mx:DataGrid>



С XML такой номер не пройдет, потому как bindProperty не позволяет использовать в качестве своих параметров E4X, тоисть написать что-то типа BindingUtils.bindProperty(dg, "dataProvider", this, "xxx.item") у Вас не получиться.