SelectionChanged的子ListBox

时间:2010-03-09 23:33:54

标签: wpf listbox datatemplate selecteditem

我有一个ListBox绑定到ObservableCollection,其中ItemTemplate包含另一个ListBox。首先,我尝试以这种方式从我的MainWindowViewModel中获取所有列表框中的最后一个选定项(父项和内部项):

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

所以,例如,在父ListBox的项目的DataTemplate中,我得到了这个:

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

现在的问题是,当我从父ListBox中选择一个项目然后从子列表框中选择一个项目时,我得到了这个:

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

如您所见,同时选择了两个项目。我该如何解决?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我已经通过为ListBox控件的SelectedEvent注册一个ClassHandler来解决这个问题。

我刚刚在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能够停止。