2010-03-09 5 views
0

J'ai un ListBox lié à un ObservableCollection avec un ItemTemplate qui contient un autre ListBox. Tout d'abord, j'ai essayé d'obtenir le dernier élément sélectionné de toutes les listes déroulantes (le parent et les internes) de mon MainWindowViewModel cette façon:SelectionChanged d'un enfant ListBox

public object SelectedItem 
{ 
    get { return this.selectedItem; } 
    set 
    { 
     this.selectedItem = value; 
     base.NotifyPropertyChanged("SelectedItem"); 
    } 
} 

Ainsi, par exemple, dans le DataTemplate des éléments de ListBox parent j'ai ceci:

<ListBox ItemsSource="{Binding Tails}" 
SelectedItem="{Binding Path=DataContext.SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/> 

le problème maintenant est que lorsque je sélectionne un élément dans la liste parent et un élément d'un enfant ListBox, je reçois ceci:

http://i40.tinypic.com/j7bvig.jpg

Comme vous pouvez le voir, deux éléments sont sélectionnés en même temps. Comment puis-je résoudre cela?

Merci d'avance.

Répondre

0

J'ai déjà résolu ce problème en enregistrant un ClassHandler pour l'objet SelectedEvent du contrôle ListBox.

Je viens d'ajouter ceci dans le constructeur de ma classe MainWindow:

EventManager.RegisterClassHandler(typeof(ListBox), 
      ListBox.SelectedEvent, 
      new RoutedEventHandler(this.ListBox_OnSelected)); 

De cette façon, mon gestionnaire d'événements ListBox_OnSelected sera appelée à chaque fois une zone de liste est appelée, et avant que les gestionnaires d'événements du contrôle lui-même sont appelés .

Dans le MainWindowViewModel j'ai une propriété appelée SelectedListBox qui garde la trace dont l'un est sélectionné:

public System.Windows.Controls.ListBox SelectedListBox 
{ 
    get { return this.selectedListBox; } 
    set 
    { 
     if (this.selectedListBox != null) 
     { 
      this.selectedListBox.UnselectAll(); 
     } 
     this.selectedListBox = value; 
    } 
} 

Pourquoi ne pas en utilisant un simple gestionnaire d'événements SelectionChanged? Parce que dans le code ci-dessus, chaque fois que vous désélectionnez une zone de liste, elle déclenche à nouveau le même événement, obtenant une boucle infinie d'événements que heureusement WPF est capable d'arrêter.

Questions connexes