SelectionChanged дочернего ListBox - PullRequest
0 голосов
/ 10 марта 2010

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

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}}}"/>

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

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

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

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

1 Ответ

0 голосов
/ 12 марта 2010

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

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

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

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

В 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 может остановить.

...