Le principe est simple, car les charts contiennent une variable membre de type tableau appelé series,
qui contient des objets hérités de la classe Series (ColumnSeries, BarSeries,…)
Donc en théorie, pour ajouter une série à un chart, il suffirait de faire qq chose comme:
myChart.series.push(new ColumnSeries(...))
Oui ! sauf que le changement ne sera pas reflété visuellement ! Tout simplement car la variable « series » n’est pas de type ArrayCollection mais Array, et n’envoie pas d’événements PropertyChange.
Pour que le changement soit immédiatement visible, il faut en fait réaffecter le tableau après l’avoir modifié:
var mySeries : Array = myChart.series
mySeries.push(new Serie(...))
ou
mySeries.removeAt(…)
// La petite ligne « magique » qui fait le refresh visuel :
myChart.series = mySeries
Tout cela s’explique quand on examine le code du framework flex ci-dessous, (ChartBase.as)
/**
* An Array of Series objects that define the chart data.
* Each chart defines the type of Series objects
* that you use to populate this array.
* For example, a ColumnChart expects ColumnSeries objects
* as part of this Array.
* Some charts accept any object of type IChartElement
* as part of the Array, but in general each chart
* expects a specific type.
*/
public function get series():Array {
return _userSeries;
}
/**
* @private
*/
public function set series(value:Array):void
{
value = value == null ? [] : value;
_userSeries = value;
for(var i:int = 0; i < value.length; ++i)
{
if (value[i] is Series)
{
(value[i] as Series).owner = this;
}
}
invalidateSeries();
invalidateData();
legendDataChanged();
}
Comme la fonction invalidateSeries est protected, on ne peut pas l’appeler directement, d’où la réaffectation !
Conclusion: toujours aller lire les sources du framework !
Cheers