2010-03-09 3 views
0

У меня есть ListBox, связанный с ObservableCollection с ItemTemplate, который содержит другой ListBox. Прежде всего, я пытался получить последний выбранный элемент всех ListBoxes (либо родитель и внутренние из них) от моего MainWindowViewModel так:SelectionChanged of child ListBox

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

Так, например, в DataTemplate из пунктов родительский ListBox у меня есть это:

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

проблема сейчас в том, что при выборе элемента из родительского ListBox, а затем элемент из детского ListBox, я получаю это:

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

Как вы можете видеть, одновременно выбираются два элемента. Как я могу это решить?

Заранее спасибо.

ответ

0

Я уже решил эту проблему, зарегистрировав ClassHandler для SelectedEvent элемента управления ListBox.

Я добавил это в конструкторе моего класса MainWindow:

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

Таким образом, мой обработчик события ListBox_OnSelected будет вызываться всякий раз, когда называется ListBox, и до обработчиков событий контроля сам называются ,

В MainWindowViewModel У меня есть свойство, называемое SelectedListBox, отслеживающий из которых выбирается один:

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

Почему не с помощью простого SelectionChanged обработчика событий? Потому что в приведенном выше коде каждый раз, когда вы отменяете выбор из списка, он снова вызывает одно и то же событие, получая бесконечный цикл событий, которые, к счастью, WPF может остановиться.