PDA

Просмотр полной версии : custom itemRenderer


romantique
13.08.2008, 10:46
Всем привет. Пытаюсь юзать кастомный рендерер для дата грида. Но пока получается нечто для меня странное и непонятное. Вот что я дела:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:bench="components.benchmark.*">
<mx:Script>
<![CDATA[
private function sampleXML():XML
{
var xml:XML =
<bench name="top 10">
<company name="Sibers" tend="up"/>
<company name="Adobe" tend="up"/>
</bench>
}
]]>
</mx:Script>
<bench:BenchmarkRanking sourceFile="{sampleXML()}"/>
</mx:Application>

Вот компонента BenchmarkRanking

<mx:Panel>
<mx:DataGrid id="dataGrid" dataProvider="{tends}">
<mx:columns>
<mx:DataGridColumn dataField="company"/>
<mx:DataGridColumn itemRenderer="BenchRenderer"/>
</mx:columns>
</mx:DataGrid>
<mx:Script>
<![CDATA[
private var tends:Array = null;

public function set sourceFile(obj:XML):void
{
// забиваю массив tends начинкой из XML
}
]]>
</mx:Script>
</mx:Panel>

И сам кастомный рендерер:

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="addSymbol(event)">
<mx:Script>
<![CDATA[
[Embed('/swf/tend.swf', symbol='UpArrow_design')]
private static var UpArrow:Class;

[Embed('swf/tend.swf',symbol='DownArrow_design')]
private static var DownArrow:Class;

private function addSymbol(event:FlexEvent):void
{
var sprite:Sprite = null;
if( data.tend=="up" )
sprite = new UpArrow() as Sprite;
else if( data.tend=="down" )
sprite = new DownArrow() as Sprite;
wrapper.addChild(sprite);
}
]]>
</mx:Script>
<mx:UIComponent id="wrapper"/>
</mx:Canvas>

Всё бы ничего, но вот когда я сортирую датагрид тыцканьем по дататипсам с моим рендерингом происходит нечто странное. Вапще как бы там должны быть стреоски, две, зелёная и красная... Но порой они обе красные, или обе зелёные...

Вот аутпут
http://ccfit.nsu.ru/~stulov/BenchmarkingRanking.swf

Потыкайте сортировку и понаблюдайте за стрелосками. Они скачу совсем не соответственно остальным айтемам в столбце...

Может я чё делаю неверно? Или не понял механизма кастомного рендеринга... Может кто нибудь подсказать выход?

Выложенный код немного упрощён но смысл тот же

romantique
13.08.2008, 16:02
Уже разобрался. Сделал вот так:
public class BenchmarkTendRenderer extends VBox
{
public function BenchmarkTendRenderer()
{
super();
}

override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
// вот тут своя рисовалка
super.updateDisplayList(unscaledWidth,unscaledHeight);
}
}