0

別のListBoxを含むItemTemplateを使用してObservableCollectionにバインドされたListBoxがあります。まず、次の方法で、すべてのリストボックス(親と内部のいずれか)の最後に選択されたアイテムをMainWindowViewModelから取得しようとしました。

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

ここでの問題は、親リストボックスからアイテムを選択してから子リストボックスからアイテムを選択すると、次のようになることです。

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

ご覧のとおり、2つのアイテムが同時に選択されています。どうすればそれを解決できますか?

前もって感謝します。

4

1 に答える 1

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が停止できるイベントの無限ループが発生します。

于 2010-03-12T12:53:52.270 に答える