Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   DataProvider в MXML и AS3 в чем разница (http://www.flasher.ru/forum/showthread.php?t=113261)

Захаров 23.06.2008 16:46

DataProvider в MXML и AS3 в чем разница
 
Ниже приведен пример загрузка 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") у Вас не получиться.


Часовой пояс GMT +4, время: 19:30.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.