Click/focus ListBoxItem 的内容不会冒泡
Click/focus on a ListBoxItem's content doesn't bubble up
我有一个 ListBox
声明如下:
<ListBox ItemsSource="{Binding Contracts}" SelectedItem="{Binding SelectedContract}">
<ListBox.ItemTemplate>
<DataTemplate>
<ListBoxItem Content="{Binding Name}">
<ListBoxItem.ToolTip>
<Grid>
[code omitted for reasons of clarity]
</Grid>
</ListBoxItem.ToolTip>
</ListBoxItem>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我期望正常的选择行为,因为我玩的是项目的 ToolTip
而不是它的内容结构。
但是,单击一个项目的名称并不会 focus/select 该项目。只有单击每个项目之间的那个微小的 space(最简单的方法是项目名称和 ListBox
边框之间的 space),该项目得到 focused/selected.
当然,我四处搜索并认为我找到了罪魁祸首(事件没有冒泡)。但是在 SO 或其他地方提供的任何解决方案,e。 G。添加这样的代码:
<ListBoxItem.Style>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsSelected" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
</ListBoxItem.Style>
原来没有解决问题。所以,我假设我做错了什么,而且我太盲目了,看不到它。虽然可能有使用代码隐藏的解决方案,但我更喜欢坚持干净和纯粹 XAML.
请帮助我,理解我的错误并解决它。
如果目的是为ListBoxItem 添加工具提示,您可以使用ItemContainerStyle。 ListBox 为每个数据绑定项创建 ListBoxItems,将 ListBoxItem 添加到
DataTemplate 不是必需的,如果它破坏了某些功能,请尽量避免使用它
<ListBox>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<Setter Property="ToolTip">
<Setter.Value>
<Grid>
<TextBlock Text="{Binding .}"/>
</Grid>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding .}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
edit:我使用 Snoop 应用程序通过 DataTemplate 中的 ListBoxItem 检查您的变体。每个 ListBox 元素的可视树中有 2 个 ListBoxItems,可能其中一个阻止选择另一个
我有一个 ListBox
声明如下:
<ListBox ItemsSource="{Binding Contracts}" SelectedItem="{Binding SelectedContract}">
<ListBox.ItemTemplate>
<DataTemplate>
<ListBoxItem Content="{Binding Name}">
<ListBoxItem.ToolTip>
<Grid>
[code omitted for reasons of clarity]
</Grid>
</ListBoxItem.ToolTip>
</ListBoxItem>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我期望正常的选择行为,因为我玩的是项目的 ToolTip
而不是它的内容结构。
但是,单击一个项目的名称并不会 focus/select 该项目。只有单击每个项目之间的那个微小的 space(最简单的方法是项目名称和 ListBox
边框之间的 space),该项目得到 focused/selected.
当然,我四处搜索并认为我找到了罪魁祸首(事件没有冒泡)。但是在 SO 或其他地方提供的任何解决方案,e。 G。添加这样的代码:
<ListBoxItem.Style>
<Style TargetType="ListBoxItem">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsSelected" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
</ListBoxItem.Style>
原来没有解决问题。所以,我假设我做错了什么,而且我太盲目了,看不到它。虽然可能有使用代码隐藏的解决方案,但我更喜欢坚持干净和纯粹 XAML.
请帮助我,理解我的错误并解决它。
如果目的是为ListBoxItem 添加工具提示,您可以使用ItemContainerStyle。 ListBox 为每个数据绑定项创建 ListBoxItems,将 ListBoxItem 添加到 DataTemplate 不是必需的,如果它破坏了某些功能,请尽量避免使用它
<ListBox>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<Setter Property="ToolTip">
<Setter.Value>
<Grid>
<TextBlock Text="{Binding .}"/>
</Grid>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding .}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
edit:我使用 Snoop 应用程序通过 DataTemplate 中的 ListBoxItem 检查您的变体。每个 ListBox 元素的可视树中有 2 个 ListBoxItems,可能其中一个阻止选择另一个