locked
Binding d'une Grid et de TextBlock avec XElement RRS feed

  • Question

  • Bonjour,
    Tout d'abord je ne sais pas si je pose la question au bon endroit...
    Je rencontre un problème de binding dans un projet Silverlight.

    Mon objectif est de construire en C# (dans le code donc) une Grid contenant N TextBlock dynamiquement.
    Pour ce faire je dispose de:

    - Un XElement contenant les différents champs à afficher:
    <Table>
      <NUMERO_TACHE>8</NUMERO_TACHE>
      <RECALEE>0</RECALEE>
      <CD_PLA_TACHE_PH>23798</CD_PLA_TACHE_PH>
      <ID_PHASE>    2.00</ID_PHASE>
      ...
    </Table>
    - Une IEnumerable<XElement> contenant la configuration visuelle à appliquer pour chacun de ces champs:
    <Table>
      <CHAMP>NUMERO_TACHE</CHAMP>
      <VISIBLE>1</VISIBLE>
      <R>26</R>
      <G>64</G>
      <B>8</B>
      <X>591</X>
      <Y>-1</Y>
      <GRAS>0</GRAS>
      <TAILLE>16</TAILLE>
    </Table>
    ...
    <Table>
      <CHAMP> CD_PLA_TACHE_PH </CHAMP>
      <VISIBLE>1</VISIBLE>
      <R>26</R>
      <G>64</G>
      <B>8</B>
      <X>591</X>
      <Y>-1</Y>
      <GRAS>0</GRAS>
      <TAILLE>16</TAILLE>
    </Table>
    ...

    A l'heure actuelle, je créé mes textblock "à la rache" en parcourant ma liste de config, et en attribuant les propriétés des textblock à la main:

    Grid conteneurTexte = new Grid();
    conteneurTexte.VerticalAlignment = VerticalAlignment.Stretch;
    conteneurTexte.HorizontalAlignment = HorizontalAlignment.Stretch;
    foreach (XElement configChampsElement in _configChamps)
                {
                    TextBlock t = new TextBlock();
                    t.HorizontalAlignment = HorizontalAlignment.Left;
    
                   
    
                    try
                    {
                        // NB_CARAC
                        int nbCarac = int.Parse(configChampsElement.Element("NB_CAR").Value);
    
                        t.Text =
                                   tache.Element(configChampsElement.Element("CHAMP").Value) == null
                                || tache.Element(configChampsElement.Element("CHAMP").Value).Value == null
                                || tache.Element(configChampsElement.Element("CHAMP").Value).Value == ""
                                ? ""
                                : (
                            // TITRE
                                    (configChampsElement.Element("TITRE") == null ? "" : configChampsElement.Element("TITRE").Value + " ") +
                            // VALEUR
                                    (nbCarac > 0 && nbCarac < tache.Element(configChampsElement.Element("CHAMP").Value).Value.Trim().Length
                                        ? tache.Element(configChampsElement.Element("CHAMP").Value).Value.Trim().Substring(0, nbCarac)
                                        : tache.Element(configChampsElement.Element("CHAMP").Value).Value.Trim())
                                  );
    
    
                        // POSITION
                        t.Margin =
                            new Thickness(
                                Double.Parse(configChampsElement.Element("X").Value),
                                Double.Parse(configChampsElement.Element("Y").Value),
                                0,
                                0);
    
                        // BOLD
                        t.FontWeight = (configChampsElement.Element("GRAS").Value == "1") ? FontWeights.Bold : FontWeights.Normal;
    
    
                        // COULEUR
                        t.Foreground = new SolidColorBrush(
                                Color.FromArgb(255,
                                byte.Parse(configChampsElement.Element("R").Value),
                                byte.Parse(configChampsElement.Element("G").Value),
                                byte.Parse(configChampsElement.Element("B").Value)));
    
                        // FONTSIZE
                        t.FontSize = Double.Parse(configChampsElement.Element("TAILLE").Value);
    
                    }
                    catch (Exception) { }
                    
                    // Ajout du controle de texte dans le conteneur
                    conteneurTexte.Children.Add(t);                    
                }

    Y'a t il un moyen plus intelligent de faire ceci??
    Je n'arrive pas à faire fonctionner un binding avec un path de type "Element[CHAMP].Value"...

    Merci d'avance.


    mardi 9 février 2010 11:50

Réponses

  • Bonjour,

     

    Peut-être ces exemples vous donneront une piste. Ce n’est pas tout à fait la même chose, mais je pense que c’est proche.

    http://forums.silverlight.net/forums/p/140817/314481.aspx

    http://stackoverflow.com/questions/340645/binding-xml-in-sliverlight-without-nominal-classes

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Alex Petrescu mardi 16 février 2010 09:34
    vendredi 12 février 2010 14:27
  • Désolé pour le retard de ma réponse.
    J'avais déjà consulté les liens que vous m'avez donné, mais cela ne répond pas exactement à ma question.

    En réalité je souhaitais avoir des infos sur 2 points:
    - La méthode la plus subtile pour construire l'ensemble de textblocks, en piochant des infos dans 2 sources linq
    - Construire un binding avec un XElement, en lui donnant dans le "path" la bonne info à aller chercher (par exemple Element("X").Value pour la marge, ou Element("Bold").Value pour le FontWeight). Tout ce que j'ai essayé pour construire le path n'a pas fonctionné. J'ai donc essayé avec un Converter, mais je ne crois pas que cela s'adapte bien à ce que je souhaite faire.

    Ne vous en faites pas, la solution que j'ai, même si elle n'est pas très subtile, a le mérite de fonctionner, et je n'ai plus tellement le temps pour le moment de la modifier. C'était un peu pour ma culture personnelle, frustré de ne pas arriver à construire mon Binding :-)

    Je vous remercie, je considère le sujet clos.
    • Marqué comme réponse Corentin A_ mardi 16 février 2010 10:41
    mardi 16 février 2010 10:40

Toutes les réponses

  • Bonjour,

     

    Peut-être ces exemples vous donneront une piste. Ce n’est pas tout à fait la même chose, mais je pense que c’est proche.

    http://forums.silverlight.net/forums/p/140817/314481.aspx

    http://stackoverflow.com/questions/340645/binding-xml-in-sliverlight-without-nominal-classes

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    • Marqué comme réponse Alex Petrescu mardi 16 février 2010 09:34
    vendredi 12 février 2010 14:27
  • Bonjour,

     

    Avez-vous enregistré des progrès avec votre projet ? Faut-il chercher encore ?

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    lundi 15 février 2010 14:14
  • Désolé pour le retard de ma réponse.
    J'avais déjà consulté les liens que vous m'avez donné, mais cela ne répond pas exactement à ma question.

    En réalité je souhaitais avoir des infos sur 2 points:
    - La méthode la plus subtile pour construire l'ensemble de textblocks, en piochant des infos dans 2 sources linq
    - Construire un binding avec un XElement, en lui donnant dans le "path" la bonne info à aller chercher (par exemple Element("X").Value pour la marge, ou Element("Bold").Value pour le FontWeight). Tout ce que j'ai essayé pour construire le path n'a pas fonctionné. J'ai donc essayé avec un Converter, mais je ne crois pas que cela s'adapte bien à ce que je souhaite faire.

    Ne vous en faites pas, la solution que j'ai, même si elle n'est pas très subtile, a le mérite de fonctionner, et je n'ai plus tellement le temps pour le moment de la modifier. C'était un peu pour ma culture personnelle, frustré de ne pas arriver à construire mon Binding :-)

    Je vous remercie, je considère le sujet clos.
    • Marqué comme réponse Corentin A_ mardi 16 février 2010 10:41
    mardi 16 février 2010 10:40