2014-09-11 2 views
-3

Pourquoi y a-t-il une erreur? Je veux écran sur le contenu de l'élément sélectionné (Dans cet exemple .Text)Sélection ListBox

XAML:

<ListBox Name="Lbox" SelectionChanged="Lbox_SelectionChanged" 
     SelectionMode="Extended"> 
    <TextBlock>AAA</TextBlock> 
    <TextBlock>BBB</TextBlock> 
    <TextBlock>CLabel</TextBlock> 
</ListBox> 
<Button Click="Button_Click">Click</Button> 

code:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    StringBuilder str = new StringBuilder(); 
    foreach (ListBoxItem item in Lbox.Items) 
    { 
     if (item.IsSelected) 
     { 
      TextBlock t = item as TextBlock; // Error, Can not cast. But why? 
      str.Append(t.Text + " "); 
     } 
    } 
    MessageBox.Show(str.ToString()); 
} 
+0

Quelle est l'erreur? – APerson

+0

En regardant cela dans un débogueur vous montrera pourquoi il y a une erreur. – Zache

+1

@APerson Impossible de lancer 'ListBoxItem' en 'TextBlock' –

Répondre

4

Vous recevez l'erreur, car un ListBoxItem is not a TextBlock. Je crois que vous pouvez accéder au contenu d'un ListBoxItem via la propriété Content.

Vous avez créé les éléments racine de votre ListBox TextBlocks. Ainsi, lorsque vous parcourez la collection Lbox.Items, ils sont TextBlocks et non ListBoxItems.

Au lieu de cela si vous changez XAML à:

<ListBox Name="Lbox"> 
    <ListBoxItem>Item1</ListBoxItem> 
    <ListBoxItem>Item2</ListBoxItem> 
    <ListBoxItem>Item3</ListBoxItem> 
</ListBox> 

Ensuite, ce code fonctionnera:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var str = new StringBuilder(); 
    foreach (ListBoxItem item in Lbox.Items) 
    { 
     if (item.IsSelected) 
     { 
      str.Append(item.Content + " "); 
     } 
    } 
    MessageBox.Show(str.ToString()); 
} 
+0

'item.Content' n'est pas une chaîne, mais le' TextBlock'. 'TextBlock t = item.Content comme TextBlock; str.Append (t.Text + ""); ' –

+0

Merci, je vais mettre à jour la réponse. – skeryl

+0

Cela ne fonctionnera pas aussi bien ... essayez-le en vs et vous verrez l'erreur de distribution la même chose! – sexta13

1

essayez ceci:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    StringBuilder str = new StringBuilder(); 
    foreach (TextBlock item in Lbox.Items) 
    { 


      str.Append(item.Text + " "); 

    } 
    MessageBox.Show(str.ToString()); 
} 
+0

Non, vous avez tort. essayez-le s'il vous plaît! – sexta13

+1

Désolé, je pensais que '.Items' est une collection de' ListBoxItems';) –

Questions connexes