单击/关注ListBoxItem的内容不会冒泡

时间:2016-10-18 09:21:23

标签: wpf listbox selection listboxitem selectionchanged

我有一个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而不是内容结构。 但是,单击项目的名称不会聚焦/选择该项目。只有点击每个项目之间的微小空间(最简单的方式是项目名称和ListBox边框之间的空格),项目才会被聚焦/选择。

当然,我在谷歌上搜索并认为我找到了罪魁祸首(事件不会冒泡)。但是在SO或其他地方提供的任何解决方案,例如。 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。

请帮助我,理解我的错误并解决它。

1 个答案:

答案 0 :(得分:1)

如果目的是为ListBoxItem添加ToolTip,则可以使用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>

编辑:我使用Snoop应用程序在DataTemplate中使用ListBoxItem检查您的变体。每个ListBox元素的可视树中有2个ListBoxItem,可能是阻止选择另一个