2009-05-27 9 views
0

Je voudrais laisser les données fournies à un DataGrid décider de la meilleure façon de le rendre (c'est-à-dire laisser les données porter un objet qui fera le rendu).Flex ItemRenderer comme champ de `data`?

Par exemple, en créant une interface "Renderable", qui a un 'renderer: IFactory' propriété, utilisé comme ci-dessous:

<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> 

Mais pour ce faire, Renderable doit étendre IEventDispatcher, qui semble comme un peu beaucoup ...

J'ai aussi essayé d'utiliser:

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

ce qui ne fait rien (en fait, la méthode getRenderer ne fait jamais appelé).

Y a-t-il une meilleure façon de procéder? Est-ce que je fais quelque chose de fondamentalement faux?

Merci!

Répondre

2

Je peux me tromper mais je pense que la propriété « données » vous faites référence dans l'exemple de code est supérieur à la « données » pour le conteneur de niveau supérieur dans votre vue et pas pour cette ligne particulière du DataGrid. Quelques autres approches viennent à l'esprit:

  1. Implémentez une classe de rendu d'élément unique qui examine les données qui lui sont transmises et utilise le rendu d'élément approprié pour le type de données fourni.
  2. Implémentez une fonction dans l'affichage de votre DataGrid qui examine votre fournisseur de données et renvoie la classe de rendu d'élément appropriée; appelez ceci à l'intérieur de la propriété DataGridColumn.itemRenderer en utilisant une expression de liaison.
  3. Implémentez une sous-classe de DataGridColumn dans laquelle la logique est incorporée pour définir la propriété itemRenderer correcte.

Je recommanderais de ne pas mélanger les "données de rendu" qui sont spécifiques à la vue avec les données de votre modèle. Sauf si vous enveloppez les données du modèle de base avec un objet qui l'expose avec le moteur de rendu (ce que certains appellent un ViewModel).

+0

Merci pour la réponse. La raison pour laquelle je veux mélanger les données et la vue de cette façon est qu'il pourrait y avoir différents types de données sortant du fournisseur et je pense qu'il y aura le moins de couplage global si chaque donnée sait comment se rendre. –

0

Faire getRenderer un [Bindable] propriété

+0

Essayé que - pas d'amour. Il semble qu'au moins l'un des problèmes est que les liaisons "ne fonctionnent pas" par une distribution. Par exemple, "{(data as Foo) .bar}" dans un ItemRenderer ne liera pas pendant que {data.bar} se liera. –

+0

Fixations à travers les moulages * fonctionnent *. C'est nécessaire surtout si vous compilez avec -compiler.show-actionscript-warnings et -compiler.show-binding-warnings. Assurez-vous de lier un getter de propriété, pas une fonction. – an0nym0usc0ward