ListBoxItem模板中的ListBox

时间:2015-06-04 20:27:46

标签: wpf wpf-controls .net-4.5

我有一个带有以下ItemTemplate的ListBox:

<DataTemplate>
  <StackPanel>
    <TextBlock .... />
    <ListBox .... />
  </StackPanel>
</DataTemplate>

我想禁止用户选择子ListBox中的项目,当用户点击子ListBox时,应分别设置父ListBox SelectedItem。

我所尝试的是将子ListBox的IsHitTestVisible设置为false,这会阻止用户在其上选择一个项目,但问题是如果我单击子ListBox,则鼠标单击不会传递给父ListBoxItem,因此永远不会被选中。

总而言之,我需要:

  • 阻止用户选择子列表框中的项目。
  • 当我们点击ItemTemplate区域中的任何位置时(即使单击子列表框),也应该选择父列表框上的
  • 项目。

1 个答案:

答案 0 :(得分:1)

您可以使用ListBox替换内部ItemsControl。根据您的问题,听起来您只需要显示一个集合,并阻止用户与之交互。一个简单的ItemsControl非常适合。  ItemsControl不支持选择,因此点击会传播到您的主ListBox

修改

根据您的评论,我建议您尝试使用其中一个选项。首先,您可以在列表框项目上将IsHitTestVisible设置为false,如以下示例中所示

<!-- XAML for the inner list box -->
<ListBox>
        <ListBox.Resources>
           <Style TargetType="{x:Type ListBoxItem}">
              <Setter Property="IsHitTestVisible" Value="False" />
           </Style>
        </ListBox.Resources>
  </ListBox>

这将导致点击事件传播到您的主列表框,同时仍然可以使用列表框。

第二,也许创建两个单独的列表框会更容易?同样,您还没有完全解释为什么需要这样做,但尝试加载具有不同功能模式的一个控件有时会使事情过于复杂。有两个控件,并且根据某些条件一次只显示一个控件,可以很简单地简化XAML。