Hi,
Thanks, I now get that addItem method was responsible for triggering
the property change event. But I am not very clear what purpose does
it serve to have the dataProvider as Bindable. Based on your example I
created a class Company and used an Arraycollection companyList to
display companies in the datagrid. It did not matter whether the
companyList was Bindable or not. All that was required was that the
name property of Company should be Bindable. Also for a list
containing Object the value of the datagrid was not updated if any
object property was changed irrespective of whether the list is
Bindable or not.
The thing is that if I do not set the dataprovider as Bindable
I get a warning that Data Binding would not be able to detect
assignments to the dataProvider. I would be grateful if you could
point me to a scenario where declaring the dataProvider as Bindable
makes a difference. Would it be in cases like where I use something
like dataGrid2.dataProvider = {dataGrid1.dataProvider}.
Following is the modified code that I tried out:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" initialize="createCompanies()">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
[Bindable]
public var dp:ArrayCollection = new
ArrayCollection([{index:1,word:"Test1"},{index:2, word:"Test2"}]);
public var companyList:ArrayCollection = new ArrayCollection();
/*
* Does not work as the word property in Object is not bindable
*/
public function changeDataProvider():void
{
var obj:Object = dp.getItemAt(0);
obj["word"] = "Modified Test";
}
public function createCompanies():void{
var c1:Company = new Company();
var c2:Company = new Company();
c1.name= "ABC";
c2.name = "XYZ";
companyList.addItem(c1);
companyList.addItem(c2);
}
/*
* Works if name is declared as Bindable in the Company class
*/
public function changeCompany():void{
var obj:Company = companyList.getItemAt(0) as Company;
obj.name = "ABC Modified";
}
]]>
</mx:Script>
<mx:HBox>
<mx:VBox>
<mx:DataGrid dataProvider="{dp}"/>
<mx:Button click="changeDataProvider()" label="Change
data"/>
</mx:VBox>
<mx:VBox>
<mx:DataGrid dataProvider="{companyList}">
<mx:columns>
<mx:DataGridColumn dataField="name"
headerText="Company"/>
</mx:columns>
</mx:DataGrid>
<mx:Button click="changeCompany()" label="Change Company"/>
</mx:VBox>
</mx:HBox>
</mx:Application>
*******Company.as****************
package
{
public class Company
{
public function Company()
{
super();
}
[Bindable]
public var name:String;
}
}
--- In [email protected], "Josh McDonald" <[EMAIL PROTECTED]> wrote:
>
> If you call addItem(), updateItem(), etc, the PropertyChangedEvent is
> dispatched by the IList implementor (ie, ArrayCollection).
>
> But, if you have an IList of objects, and you do this:
>
> var company : Company = companyList.getItemAt(3) as Company;
> company.name = "New name";
>
> then you'll only get the new data on screen if Company (or
Company.name) is
> marked [Bindable]
>
> When you call the modifying methods on the dataprovider itself, then the
> change is marked as happening on the IList (and it dispatches the
> PropertyChangedEvent). But if you change the content of an object
contained
> within that list, nobody knows about it unless you add the [Bindable].
> [Bindable] is a compile-time decorator that dispatches the events on
your
> behalf.
>
> If I'm making things muddier rather than clearer with that, let me
know ;-)
>
> -J
>
> On Mon, May 19, 2008 at 2:01 PM, gaurav1146 <[EMAIL PROTECTED]> wrote:
>
> > Hi,
> > I have been using Bindable tag for data providers in datagrid, list
> > etc. The doc states that this ensures that the destination datagrid
> > would reflect the change when the dataprovider is changed. But I have
> > observed that even if I do not use the Bindable tag the datagrid is
> > still updated when the dataprovider changes. Here is a simple example:
> >
> > <?xml version="1.0" encoding="utf-8"?>
> > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
> > layout="absolute">
> > <mx:Script>
> > <![CDATA[
> > import mx.collections.ArrayCollection;
> > /*Bindable tag not added. Flex Builder gives a warning when
> > the variable is referenced in the datagrid but it still works.*/
> > private var dp:ArrayCollection = new ArrayCollection([{index:1,
> > word:"Test1"},{index:2, word:"Test2"}])
> > public function changeDataProvider():void
> > {
> > var obj1:Object = new Object();
> > obj1["index"] = 1;
> > obj1["word"] = "Modified Test1";
> > dp.setItemAt(obj1,0);
> > var obj2:Object = new Object();
> > obj2["index"] = 3;
> > obj2["word"] = "Test3";
> > dp.addItem(obj2);
> > }
> > ]]>
> > </mx:Script>
> > <mx:VBox>
> > <mx:DataGrid dataProvider="{dp}"/>
> > <mx:Button click="changeDataProvider()" label="Change data"/>
> > </mx:VBox>
> > </mx:Application>
> >
> > In the above example the datagrid changes on the button click. Please
> > let me know if I am missing somthing.
> >
> >
> >
>
>
>
> --
> "Therefore, send not to know For whom the bell tolls. It tolls for
thee."
>
> :: Josh 'G-Funk' McDonald
> :: 0437 221 380 :: [EMAIL PROTECTED]
>