2010-11-15 24 views
2

J'ai un ListBox pour quelques articles, et je dois pouvoir les cliquer. Le problème est, l'événement SelectionChanged ne se déclenche pas lorsque je clique sur le texte de l'élément, seulement si je clique sur la partie vide. Je suis assez nouveau à WPF, et je ne comprends pas pourquoi cela se passe.La sélection de ListBox WPF ne fonctionne pas

XAML:

<ListBox Name="lBoxVouchers" BorderThickness="0" FontSize="15" SelectionChanged="lBoxVouchers_SelectionChanged"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ListBoxItem Content="{Binding Name}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Handler:

private void lBoxVouchers_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    if (e.AddedItems.Count > 0) 
     MessageBox.Show("You just selected " + e.AddedItems[0]); 
} 

Je liant la liste des objets dans le code via la propriété lBoxVouchers.ItemsSource, et ils apparaissent. Chaque objet a une propriété Name, bien sûr.

J'ai essayé de définir IsEnabled sur ListBox et les éléments, à la fois dans le code et XAML, mais cela n'aide pas.

Les commentaires sur les meilleures façons de le faire dans WPF sont également les bienvenus.

Répondre

2

Si vous voulez seulement afficher la propriété Name vous pouvez définir votre zone de liste comme ceci:

<ListBox Name="lBoxVouchers" BorderThickness="0" FontSize="15" SelectionChanged="lBoxVouchers_SelectionChanged" DisplayMemberPath="Name" /> 

Si vous mettez vos articles sur un ObservableCollection sur le code-behind, vous pouvez également passer la liaison de données à XAML:

<ListBox Name="lBoxVouchers" BorderThickness="0" FontSize="15" SelectionChanged="lBoxVouchers_SelectionChanged" DisplayMemberPath="Name" ItemsSource={Binding Path=Items}" /> 

Et votre code derrière vous devriez avoir quelque chose comme:

ObservableCollection<object> Items {get; set} 

A propos du gestionnaire, je voudrais aussi faire quelque chose comme ceci:

private void lBoxVouchers_SelectionChanged(object sender, SelectionChangedEventArgs e) { 
    if (((ListBox)sender).SelectedItem != null) 
     MessageBox.Show("You just selected " + (ListBox)sender).SelectedItem); 
} 
+0

Il a déjà dit qu'il a réussi à faire la liaison de données et les éléments apparaissent. Vous n'avez pas répondu à la question juste montré une façon différente de réaliser le même objectif. –

+0

Ce qui est bien parce que j'ai dit que j'apprécierais tous les commentaires utiles sur mon code. – Edgar

+0

L'utilisation de la propriété DisplayMemberPath l'a corrigée. Je n'ai toujours aucune idée pourquoi ça n'a pas marché dans l'autre sens. – Edgar

0

Définissez IsSynchronizedWithCurrentItem="true" dans la zone de liste.

Here Vous pouvez trouver une point de départ pour obtenir plus de détails sur cette propriété.

Si vous définissez cette propriété sur true, la sélection est synchronisée avec l'élément actuel qui contient l'élément sélectionné. Lorsque vous cliquez sur l'espace vide, l'élément en cours passe probablement à null et vous appelez votre gestionnaire d'événements.

+0

Cela n'a pas aidé. – Edgar

0

peut être le contenu de l'élément listbox n'est pas étirée. il suffit d'écrire ce style pour l'élément de la liste et essayer.

<Style TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
</Style> 
+0

Cela n'a pas aidé. – Edgar