查看下图,您会看到第四个ListBoxItem中的TextBox具有Focus和KeyboardFocus,而第二个ListBoxItem被选中。
我知道我可以捕获Textbox的GotFocus事件,获取它的DataContext,并设置绑定对象的IsSelected属性,以便ListBoxItem被选中。
我想知道当用户点击 任何 包含的控件时,是否可以选择ListBoxItem?我问这个是因为我有一些精心设计的TreeView和一堆控件,而且我正在寻找一种简单或优雅的方法,只要用户点击它上面的任何地方就可以选择TreeViewItem。
更新
我接受了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;
}
答案 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;
}