【问题标题】:ListBox inside a ListBoxItem templateListBoxItem 模板内的 ListBox
【发布时间】:2015-06-04 20:27:45
【问题描述】:

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

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

我想禁止用户在子ListBox中选择一个项目,并且当用户点击子ListBox时,应该分别设置一个父ListBox SelectedItem。

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

总而言之,我需要:

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

【问题讨论】:

    标签: wpf wpf-controls .net-4.5


    【解决方案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 的一种简单方法。

    【讨论】:

    • 我不能使用 ItemsControl,因为它比我解释的要复杂。基本上这个子 ListBox 有两种模式:一种是不可选择的,另一种是可选择的。在这两种模式下,子 ListBox 具有不同的 ItemsPanel 面板。我不想过多介绍细节,因为那样会使事情变得更加复杂。出于这个原因,我专门询问如何使用 ListBox 来实现这一点。
    • @Goran,很有趣。我会做一些实验。您能否编辑您的问题以包括更改 ItemsPanel 背后的一些细节,您是否使用 MVVM 方法,以及任何其他相关细节?
    • @Goran,更新了我的答案。请评论这是否有助于您更接近解决方案。
    猜你喜欢
    • 2012-11-30
    • 2020-05-12
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 2012-11-07
    相关资源
    最近更新 更多