2009-05-27 5 views
0

Ich würde gerne die Daten an ein DataGrid zur Verfügung gestellt entscheiden, wie es am besten gerendert werden soll (das heißt, lassen Sie die Daten tragen ein Objekt, das das Rendern tun wird).Flex ItemRenderer als ein Feld von `Daten`?

Zum Beispiel durch einen „Renderfähig“ Schnittstelle zu schaffen, die einen ‚Renderer: IFactory‘ hat die Eigenschaft, dann wie unten verwendet:

<mx:DataGrid x="0" y="0" width="100%" dataProvider="{myDataProvider}"> 
    <mx:columns> 
    <mx:DataGridColumn headerText="Task" width="100" 
     itemRenderer="{(data as Renderable).renderer}"/> 
    </mx:columns> 
</mx:DataGrid> 

Aber um dies zu tun, hat Render IEventDispatcher, zu erweitern, die scheint viel wie ein kleines ...

ich habe auch versucht, mit:

itemRenderer="{(data as Renderable).getRenderer()}" 

die nichts tut (in der Tat, die getRenderer Methode nie aufgerufen wird).

Gibt es einen besseren Weg, dies zu tun? Mache ich etwas grundsätzlich falsch?

Danke!

Antwort

2

Ich könnte falsch sein, aber ich denke, die „data“ Sie gesucht haben, verweisen oben in dem Codebeispiel ist die „Daten“ für die Top-Level-Container in Ihrer Sicht und nicht für diese bestimmte Zeile des DataGrid. Ein paar andere Ansätze kommen mir in den Sinn:

  • Implementieren Sie eine einzelne Elementrenderer-Klasse, die die übergebenen Daten untersucht und den richtigen Elementrenderer für den Typ der bereitgestellten Daten verwendet.
  • Implementieren Sie eine Funktion in der Ansicht Ihres DataGrid, die Ihren dataProvider untersucht und die richtige Elementrendererklasse zurückgibt. Rufen Sie dies innerhalb der DataGridColumn.itemRenderer-Eigenschaft mit einem Bindungsausdruck auf.
  • Implementieren Sie eine Unterklasse von DataGridColumn, in die die Logik eingebettet ist, um den richtigen itemRenderer festzulegen.
  • Ich würde tatsächlich empfehlen, "Renderer-Daten" zu mischen, die View-spezifische Daten von Ihrem Modell sind. Es sei denn, Sie verpacken die Kernmodelldaten mit einem Objekt, das sie zusammen mit dem Renderer verfügbar macht (was einige Leute als ViewModel bezeichnen).

    +0

    Danke für die Antwort. Der Grund, warum ich die Daten und die Ansicht auf diese Weise mischen möchte, ist, dass es verschiedene Arten von Daten geben könnte, die aus dem Provider kommen und ich denke, dass es die geringste Gesamtkopplung geben wird, wenn jedes Datum weiß, wie es sich selbst rendert. –

    0

    Make getRenderer a [Bindable] Eigenschaft

    +0

    Versuchte das - keine Liebe. Es scheint, als ob zumindest eines der Probleme darin besteht, dass Bindungen "nicht funktionieren", obwohl eine Besetzung vorliegt. Beispiel: "{(Daten als Foo) .bar}" in einem ItemRenderer bindet nicht, während {data.bar} gebunden wird. –

    +0

    Bindungen durch Abgüsse * funktionieren *. Es wird besonders benötigt, wenn Sie mit -compiler.show-actionsscript-warnings und -compiler.show-binding-warnings kompilieren. Stellen Sie sicher, dass Sie für einen Eigenschaften-Getter, nicht für eine Funktion, verbindlich sind. – an0nym0usc0ward