2008/12/17

labelFunctionかItemRendererか。それとあとFormatter (2)

前回の続き。

まずは、「動的に1000単位とかに切り替えられる仕組み」に挑戦。
labelFunctionで試してみる。
とはいえいきなりは難しいので、まずは1000単位にした金額フォーマットするlabelFunctionあたりから作成。

呼び出し側は

<formatters:VariableCurrencyFormatter id="formatter" unit="1000" />
<mx:DataGrid id="dg" dataProvider="{dp}">
<mx:columns>
<mx:DataGridColumn dataField="str1" />
<mx:DataGridColumn dataField="str2" />
<mx:DataGridColumn dataField="str3" />
<mx:DataGridColumn dataField="str4" />
<mx:DataGridColumn dataField="int1" labelFunction="{formatter.format}" textAlign="right"/>
</mx:columns>
</mx:DataGrid>

という感じで。

で、中で使ってるVariableCurrencyFormatterの、format()関数はこんな感じ。

public function format(item:Object, column:DataGridColumn):String
{
var dat:Object = item;

if (column != null && item.hasOwnProperty(column.dataField))
{
dat = item[column.dataField];
}

var curFormatter:CurrencyFormatter = new CurrencyFormatter();

return curFormatter.format(Number(dat) / unit);
}


さすがにこれは問題なく1000単位での表示になる。

問題は、このunitプロパティを変えてあげた時に、動的に表示が変わってほしいっていうこと。
変えるたびにdp.refresh()とかやってあげれば、DataGrid側にPropertyChangeイベントが飛んで実現できそうだけど、さすがにそれはスマートじゃないような。。。
やっぱりせっかく用意されているデータバインディングでうまくやりたいよね。