WPF:如果ListBoxItem的一个控件获得焦点,它如何被选中?

时间:2011-08-04 16:38:22

标签: .net wpf datatemplate selecteditem

查看下图,您会看到第四个ListBoxItem中的TextBox具有Focus和KeyboardFocus,而第二个ListBoxItem被选中。

我知道我可以捕获Textbox的GotFocus事件,获取它的DataContext,并设置绑定对象的IsSelected属性,以便ListBoxItem被选中。

我想知道当用户点击 任何 包含的控件时,是否可以选择ListBoxItem?我问这个是因为我有一些精心设计的TreeView和一堆控件,而且我正在寻找一种简单或优雅的方法,只要用户点击它上面的任何地方就可以选择TreeViewItem。

enter image description here

更新

我接受了Rachel的答案,因为它与ListBox完美配合,它引导我找到一个似乎支持我的TreeView的解决方案:在TreeViewItems上监听GotFocus事件,当事件发生时,设置e.Handled为true以防止事件冒泡到现在选定的TreeViewItem的祖先

的Xaml:

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <EventSetter Event="GotFocus" Handler="TVI_GotFocus"/>
            ...

C#:

    void TVI_GotFocus(object sender, RoutedEventArgs e)
    {
        e.Handled = true;
        if (!(sender is TreeViewItem))
            return;
        if (((TreeViewItem)sender).IsSelected)
            return;
        ((TreeViewItem)sender).IsSelected = true;
    }

2 个答案:

答案 0 :(得分:2)

您还应该能够针对ListBoxItem.IsKeyboardFocusWithin设置触发器,并避免使用任何代码:

<Style TargetType="ListBoxItem">
  <Style.Triggers>
    <Trigger Property="IsKeyboardFocusWithin" Value="True">
      <Setter Property="IsSelected" Value="True" />
    </Trigger>
  </Style.Triggers>
</Style>

答案 1 :(得分:1)

将其放入ListBox.Resources

<Style TargetType="{x:Type ListBoxItem}">
    <EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
</Style>

这就在Code Behind中

protected void SelectCurrentItem(object sender, KeyboardFocusChangedEventArgs e)
{
    ListBoxItem item = (ListBoxItem)sender;
    item.IsSelected = true;
}