2010-12-31 2 views
1

Es sieht so aus, als ob die neue Funke List-Komponente die IDropInItemRenderer Schnittstelle nicht berücksichtigt.Entspricht die Spark-Liste den IDropInItemRenderer-Schnittstellen?

Ie - wenn ich IDropInItemRenderer auf meinem Renderer implementieren, wird der Setter von listData nie aufgerufen.

Fehle ich etwas oder ist diese Schnittstelle jetzt veraltet?

Wenn ja, was ist der vorgeschlagene Ansatz zum Bereitstellen ähnlicher DataProvider-Kontextinformationen für den Renderer?

Zum Beispiel möchte ich den Renderer für das letzte Element in einer Auflistung etwas anders verhalten.

Ich sehe, dass IItemRenderer jetzt eine listIndex Eigenschaft definiert, jedoch funktioniert dieser Ansatz nicht ohne Kenntnis der Anzahl der Quelle DataProvider.

Antwort

1

Hier ist die Problemumgehung, die ich verwendet habe.

DataGroup tropft Sparks kompositorische Güte, in dem es eine rendererUpdateDelegate Eigenschaft exponiert, die Sie mit Ihrer eigenen Klasse einstellen können, um jede benutzerdefinierte Funktion zu liefern, nach der Sie suchen.

Während es frustrierend ist, dass die Schnittstelle fallengelassen wurde, ohne wirklich angekündigt zu werden, ist dieser Ansatz viel mächtiger.

Hier ist eine Beispielklasse. In meinem Beispiel mag ich den letzten Renderer es collapsable Eigenschaft auf false gesetzt haben:

/** 
* Decorates another IItemRendererOwner (eg., a DataGroup) and augments the updateRenderer method 
* to set the isCollapsable property */ 
public class ThreadMessageRendererUpdateDelegate implements IItemRendererOwner 
{ 
    private var _dataGroup:DataGroup; 

    public function get dataGroup():DataGroup 
    { 
     return _dataGroup; 
    } 

    public function set dataGroup(value:DataGroup):void 
    { 
     _dataGroup = value; 
     if (dataGroup) 
     { 
      dataGroup.rendererUpdateDelegate = this; 
     } 
    } 


    public var dataProvider:ArrayCollection; 

    public function ThreadMessageRendererUpdateDelegate(owner:DataGroup=null) 
    { 
     this.dataGroup = owner; 
    } 

    public function itemToLabel(item:Object):String 
    { 
     return dataGroup.itemToLabel(item); 
    } 

    public function updateRenderer(renderer:IVisualElement, itemIndex:int, data:Object):void 
    { 
     dataGroup.updateRenderer(renderer,itemIndex,data); 
     if (renderer is ThreadMessageRenderer) 
     { 
      ThreadMessageRenderer(renderer).collapsable = itemIndex < dataProvider.length - 1; 
     } 
    } 
} 

Und hier ist es zB Nutzung:

<fx:Declarations> 
    <viewer:ThreadMessageRendererUpdateDelegate dataProvider="{dataProvider}" dataGroup="{threadList}" /> 
</fx:Declarations> 
<fx:Script> 
    <![CDATA[ 
     [Bindable] 
     public var dataProvider:ArrayCollection 
    ]]> 
</fx:Script> 
    <s:DataGroup height="100%" 
       width="100%" 
       dataProvider="{dataProvider}" 
       itemRenderer="ThreadMessageRenderer" 
       id="threadList" 
       > 
    </s:DataGroup> 
0

Man! Ich habe nur lange versucht, DataGroup.rendererUpdateDelegate(...) zu finden, und habe schließlich entdeckt, warum ich das nicht tun konnte, dank dieser SO-Post.

Wie auch immer, nachdenken über das (Verschwinden von) rendererUpdateDelegate Eigentum und Ihr Angebot ein wenig mehr, ich realisiere weder sind wirklich notwendig.

DataGroup hat das rendererAdd Ereignis, das Ihnen genügend Informationen gibt, zur richtigen Zeit, um zu tun, was Sie wollen; zum Beispiel:

... 

<s:DataGroup id="dg" 
    dataProvider="{model.dataProvider}" 
    itemRenderer="{model.itemRendererFactory}" 
    rendererAdd="model.updateRenderer(event.data, event.index, event.renderer)"> 

... 

... und in den model haben wir:

public function updateRenderer(data:Object, index:int, renderer:IVisualElement):void 
{ 
    if (renderer is ICollapsable) 
    { 
     ICollapsable(renderer).collapse = index < dataProvider.length - 1; 
    } 
} 

weniger Codezeilen und klare Absicht

+0

Ich glaube nicht, 'rendererAdd' ausgelöst, wenn ein Renderer war recycelt, obwohl ich falsch liegen könnte. –

+0

Sie könnten Recht haben, nicht in der Lage, im Moment zu überprüfen, also am besten, das als Vorbehalt zu behandeln –

Verwandte Themen