2011-04-21 3 views
0

Je dois sélectionner par programme un sous-ensemble de ListBoxItems dans un contrôle ListBox (SelectedMode = Multiple).Silverlight 4: ListBoxItem Selection Problème

<Grid x:Name="LayoutRoot" Background="White"> 
    <ListBox Height="238" HorizontalAlignment="Left" Margin="26,41,0,0" Name="listBox1" VerticalAlignment="Top" Width="349" SelectionMode="Multiple" /> 
    <Button Content="Fill" Height="23" HorizontalAlignment="Left" Margin="26,12,0,0" Name="buttonFill" VerticalAlignment="Top" Width="75" Click="buttonFill_Click" /> 
    <Button Content="Randomly Select" Height="23" HorizontalAlignment="Left" Margin="116,12,0,0" Name="buttonSelectRandom" VerticalAlignment="Top" Width="104" Click="buttonSelectRandoml_Click" /> 
</Grid> 


    private void buttonFill_Click(object sender, RoutedEventArgs e) 
    { 
     for (int i = 0; i < 100; i++) 
      listBox1.Items.Add(new ListBoxItem { Content = i.ToString()}); 
    } 

    private void buttonSelectRandom_Click(object sender, RoutedEventArgs e) 
    { 
     var rand = new Random(); 

     foreach (ListBoxItem item in listBox1.Items) 
      if (rand.Next(2)==1) item.IsSelected = true; 
    } 

Cependant, il semble que seuls les éléments actuellement visibles montrent que sélectionné quand je lance le code (cliquez sur le bouton « remplissage », puis sur le bouton « sélectionnerons »). En faisant défiler le ListBox montre aucun autre ListBoxItems comme sélectionné même si une vérification de leur état "IsSelected" dans le code montrera les mettre à "vrai". Il est intéressant, si je défile manuellement à la fin de la ListBox (ou partiellement) d'abord, puis cliquez sur le bouton "Randomly Select" alors le ListBox dessine correctement tous les éléments sélectionnés. J'ai essayé beaucoup de solutions de contournement mais ne peux pas sembler trouver celui qui fonctionne. Est-ce un bug? Des solutions de contournement?

Merci pour votre aide.

Jink

Répondre

3

cela pourrait être parce que l'utilisation VirtualizingStackPanel de la zone de liste. Pouvez-vous le tester avec un StackPanel normal?

<ListBox> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel/> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
    </ListBox> 

Edit:

Une autre solution est, au lieu de faire item.IsSelected = true, vous

 foreach (int item in listBox1.Items) 
     { 
      if (rand.Next(2) == 1) 
      { 
       this.listBox1.SelectedItems.Add(item); 
      } 
     } 

Je l'ai testé et il fonctionne. :)

+0

+1 Cela a fonctionné pour moi. Cela explique également pourquoi le fait de parcourir la liste avant de définir les sélections entraîne l'affichage correct des éléments. – Kimberly

+0

merci, pouvez-vous également accepter la réponse? :) –

+0

@Xin, je ne peux pas accepter la réponse, car ce n'est pas ma question. :) Je l'ai bousculé parce qu'il n'est pas clair à partir de votre réponse si vous aviez essayé ce code vous-même, mais cela fonctionne pour résoudre ce problème particulier. Quoi qu'il en soit, dans le cas où l'OP aurait réellement besoin d'un panneau d'éléments de virtualisation à cause des éléments gourmands en mémoire, j'espère qu'ils laisseront la question ouverte pendant quelques jours et donneront à beaucoup de gens l'occasion de peser avec d'autres solutions possibles. – Kimberly