2010-03-09 79 views
0

我有一個ListBox綁定到一個ObservableCollection ItemTemplate包含另一個ListBox。首先,我想從我的MainWindowViewModel這種方式讓所有的列表框的最後一個選擇的項目(無論是家長和內部的):SelectionChanged的孩子列表框

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

因此,例如,在項目的DataTemplate中父列表框我有這樣的:

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

現在的問題是,當我選擇從父ListBox中的項目,然後從孩子列表框中的項目,我得到這個:

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

如您所見,同時選擇兩個項目。我該如何解決這個問題?

在此先感謝。

回答

0

我已經通過爲ListBox控件的SelectedEvent註冊一個ClassHandler來解決此問題。

我只是在我的主窗口類的構造函數中加入這樣的:

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能夠停止的無限循環。

相關問題