2010-10-14 6 views
0

J'ai une application flexible avec un DataGrid avec plusieurs colonnes (défini dans le fichier MXML), et j'ai besoin d '"introspecter" les colonnes de la grille. C'est-à-dire que j'ai besoin d'écrire du code ActionScript qui, étant donné l'objet DataGrid, peut déterminer différentes choses à propos de la grille (et plus spécifiquement, les colonnes de la grille).Besoin d'introspecter les entrailles de flex <mx: itemRenderer>

En particulier, si une colonne est simplement sortie de texte, je m'en fous vraiment ... mais si elle contient des contrôles "actionables" (cases à cocher, boutons de liaison, etc.). Tout d'abord, je suppose que les colonnes qui contiennent des contenus "actionables" seront dans < mx: itemRenderer > tags (sinon ce serait simplement du texte); s'il vous plaît laissez-moi savoir si c'est incorrect.

Ensuite je dois « creuser » dans les structures, tirant l'objet AS correspondant au < mx: DataGridColumn > de la < mx: DataGrid > (j'ai cela), puis en tirant l'objet AS correspondant au < mx: itemRenderer > sur le mx: DataGridColumn (deux façons différentes de faire cela, ne semble pas très utile), puis en tirant l'objet AS qui correspond à la < mx: Component > sur le mx: itemRenderer (le cas échéant , il n'est pas clair pour moi si le mx: Component crée réellement un objet), et finalement tirant l'objet AS correspondant au < mx: LinkButton > (ou autre) du composant mx: Component.

Est-ce que quelqu'un sait comment faire cela?

P.S. Je comprends qu'il n'y a presque aucune limite à ce qui pourrait se cacher dans l'itemRenderer; si je peux creuser jusque-là, je suis prêt à tester une poignée de choses que j'attends et à ignorer le reste.


Pour clarifier quelque peu, on m'a demandé de fournir la conformité à la section 508 (accessibilité) à une application existante. Bien sûr, il y a beaucoup de choses, y compris les lecteurs d'écran, etc ... mais l'une des premières étapes consiste à s'assurer que l'application peut être utilisée sans souris. La plupart des écrans existants ont une technique d'interface utilisateur composée d'un DataGrid avec des rendus d'éléments qui placent des contrôles tels que des boutons radio et des boutons de liaison et autres éléments dans les cellules (même type de contrôle tout le long de la colonne). Tout va bien, sauf que je ne trouve aucun moyen d'interagir avec ces commandes via le clavier. Donc, j'ai modifié un écran pour avoir un raccourci qui ouvre un menu contextuel, permettant à l'utilisateur de fléchir vers le haut/bas parmi les éléments actionnables, et appuyez sur ENTRÉE pour en choisir un (cochez la case, appuyez sur le bouton de lien, etc). Mais cela a été spécifique à l'écran, et il sera trop facile pour quelqu'un de mettre à jour l'écran (par exemple en ajoutant une autre colonne actionnable) et de négliger le menu. Une meilleure approche (?) A été suggérée: sous-classer la grille de données, introspecter pour trouver les colonnes exploitables, construire le menu automatiquement, et maintenant tout ce que nous avons à faire est d'échanger le SuperDataGrid pour le DataGrid, et nos écrans vont être 508 conforme.

Si quelqu'un peut recommander une meilleure façon de rendre les écrans conformes à la norme 508 (sans avoir à reconcevoir l'interface utilisateur) et avec un minimum d'effort à l'écran, je suis tout ouïe. Peut-être que je ne suis pas assez clair, puisque vous continuez à manquer le point, alors laissez-moi essayer à nouveau.

Je n'écris pas de code au niveau de l'application ... si je l'étais, je saurais exactement ce que la logique fait et je serais capable d'utiliser les données liées de la manière normale. En fait, le code au niveau de l'application utilise les données liées de la manière normale. Mais c'est totalement hors sujet. Ce que j'essaye de faire est d'écrire du code "au niveau de l'infrastructure": c'est-à-dire du code qui "passe" au-dessous du niveau de la logique de l'application. J'essaye d'ajouter efficacement une caractéristique à DataGrids qu'Adobe aurait dû inclure, mais n'a pas fait. Si je peux faire fonctionner cette classe, il sera possible de la laisser tomber dans des dizaines d'écrans SANS MOI, COMME L'AUTEUR DE LA CLASSE, SAVOIR QUOI QUE CE SOIT D'ÉCRANS OU LA LOGIQUE À L'INTÉRIEUR. La seule façon de l'imaginer est de regarder dans la grille de données et de découvrir, au moment de l'exécution, quels types de contrôles se cachent dedans, et éventuellement à quoi ils sont liés (en fait, je peux probablement exécuter n'importe quel click = " L'attribut foo() "dit de faire, et je n'aurai pas besoin de savoir à quoi ils sont liés.

Est-ce que cela a du sens?

Est-ce possible?

Répondre

0

Les rendus d'éléments interagissent avec le monde extérieur via leur propriété data. Ils doivent restituer les données comme souhaité et apporter des modifications à data selon les besoins. Ils ne devraient pas atteindre l'extérieur et vous ne devriez pas essayer d'atteindre directement le rendu d'un objet.

En ce qui concerne le problème sous-jacent que vous essayez de résoudre, vous ne l'avez pas déclaré du tout. Vous décrivez un désir de suivre uniquement une solution particulière, mais vous n'avez pas décrit le problème sous-jacent. Qu'est-ce que vous essayez vraiment d'accomplir? Ne parlez pas de l'accès aux rendus d'objet ou de creuser dans le DataGrid, mais quelle interaction ou affecter sur les lignes voulez-vous? Le problème est que votre approche est un peu en arrière et c'est pourquoi cela ne fonctionne pas.

+0

Je n'ai pas besoin d'affecter le moteur de rendu, j'ai juste besoin de creuser à travers le moteur de rendu pour trouver la case à cocher/etc à l'intérieur, que j'affecterai par des moyens normaux. – MarkV

+0

@ MarkV, eh bien, ne fais pas ça. L'état de la case à cocher est reflété dans 'data' auquel' itemRenderer' est lié. –

+0

L'état est sans doute déjà reflété dans un élément de données ... mais comment puis-je savoir qu'il y a * une * case à cocher, ou quel élément de données il est lié, d'une manière * générique * donnée mais une grille de données? Trouver l '* existence * du contrôle et/ou les données auxquelles il est lié est le problème, et non le manipuler une fois arrivé là. – MarkV

Questions connexes