none
Initialisation d'une ComboBox en fonction de ses ComboBoxItem RRS feed

  • Question

  • Bonjour à tous,

    Voilà maintenant une semaine que je suis au prise avec une ComboBox récalcitrante. Dans mon application, j'ai une ComboBox dont certains éléments peuvent avoir leur propriété IsEnabled valant false. Pour être sûr qu'au démarrage, ma ComboBox m'affiche un ComboBoxItem qui a sa propriété IsEnabled à true, je passe la propriété Items de la ComboBox dans un foreach afin de récupérer l'index du premier ComboBoxItem ayant sa propriété IsEnabled à true et j'utilise ensuite la propriété SelectedIndex de ma ComboBox pour mettre à jour son index sur le bon ComboBoxItem.

    Cette même ComboBox voit sa propriété Text bindé sur un objet pour que je puisse récupérer les valeurs choisies par l'utilisateur. Tout ceci paraît simple et fonctionne très bien dans une application "simple". Dans mon cas, ladite ComboBox se trouve dans un UserControl lui même contenu dans un UserControl de "plus haut niveau". Et il semblerait que cette hiérarchie ne plaise pas à ma ComboBox qui ne s'initialise pas correctement.

    Comme j'ai du mal à bien peindre le tableau et que je me doute que tout n'est pas très compréhensible, j'ai fait une petite application de démo dont voici le lien --> Application de démo

    Cette application se contente du minimum pour illustrer mon problème. Comme on le voit à la création d'un nouvel onglet, on détecte que la première taille disponible est le M. Or, la ComboBox ne s'initialise pas et son index est alors de -1.
    Durant mes recherches, j'ai effectué plusieurs tests et j'ai trouvé de chose qui semble bloquer cette initialisation. Si je retire le binding sur la propriété Text de la ComboBox, elle s'initialise bien. En revanche, je n'ai plus d'information sur le choix de l'utilisateur. J'obtiens le même résultat si je supprime le DataContext de mon onglet : la ComboBox s'initialise correctement mais je n'ai plus aucun retour d'information.

    A mon niveau de compétence, je ne sais plus trop quoi faire. Quelqu'un a-t-il déjà rencontré un problème similaire ? Si oui, comment l'a-t-il réglé ?

     

    PS : petite précision. J'ai fait une autre application de démo qui reprend les mêmes mécanismes à ceci prêt que la ComboBox est placée directement dans la Window. Tout s'exécute donc au lancement de la Window. Et dans ce cas là, tout fonctionne correctement.

    PS2 : je viens de faire un test. Si j'ajoute un bouton qui relance la fonction de parsing de la ComboBox, tout s'effectue correctement et la ComboBox affiche bien le premier ComboBoxItem ayant sa propriété IsEnabled à true. Le problème pourrait-il alors arriver lorsque j'ajoute le TabItem au TabControl principale ?


    Merci d'avance pour vos réponses.
    Cordialement,
    Michaël

    vendredi 14 mai 2010 16:23

Réponses

  • J'ai ENFIN trouvé une solution. Je dois dire que c'est arrivé par le plus grand des hasards.

    Quoi qu'il en soit, mon salut passe par les RoutedEvents (encore, puisque ça semble être la solution à mon autre problème).

    Il me suffit de modifier mon code comme suit :

    Dans le constructeur de mon UserControl, je fais ceci :


    public SecondLevelUC()
     {
     InitializeComponent();
     Loaded += new RoutedEventHandler(SecondLevelUC_Loaded);
     }

     

    Ensuite, je n'ai qu'à mettre mon code dans ce nouvel événement :

     

    LectureXML Lecteur = new LectureXML();
     ComboBoxTailleTShirt.ItemsSource = Lecteur.RecupTailleTShirt();
     int GoodIndex = 0;
     
     foreach (ComboBoxItem cbitem in ComboBoxTailleTShirt.Items)
     {
     if (cbitem.IsEnabled)
     {
      break;
     }
     GoodIndex++;
     }
     ComboBoxTailleTShirt.SelectedIndex = GoodIndex;

     

    Et avec ça, c'est du tout bon.

    lundi 17 mai 2010 21:12