是否有类似于WPF ListView但没有选择功能的控件?

9
我正在开发的应用程序中有一种手风琴,由扩展器制成,但每个扩展器都是独立的,而不是只允许同时打开一个选项。每个扩展器都与视图模型中的一个集合项相关联。
我目前的解决方案是使用列表框,然后将列表项源绑定到集合,并且使用项模板呈现扩展器和扩展器的内容。
问题在于,列表框将每个扩展器视为一个项目(显然),并允许选择和突出显示。突出显示有点丑陋,可以禁用,但选择会引起一些问题,因为它会导致列表滚动以尽可能多地显示已展开的扩展器。
是否有类似于堆栈面板的WPF控件(也许),可以使用项模板绑定包含的控件,但不会选择和突出显示?
            <ListBox Grid.Row="0" Grid.Column="0" Width="Auto" SelectionMode="Single" ItemsSource="{Binding Path=MeasurementSources}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Expander  Header="{Binding Name}" IsEnabled="{Binding Available}">
                        <ListBox Width="Auto" SelectionMode="Single"
                                ItemsSource="{Binding Path=Measurements}"
                                SelectedItem="{Binding Path=SelectedMeasurement}">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                    <WrapPanel>
                                        <TextBlock Text="{Binding Name}" FontWeight="Bold" />
                                        <TextBlock Text=" "/>
                                        <TextBlock Text="{Binding Created}"/>
                                    </WrapPanel>
                                </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
                    </Expander>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

请参考以下链接,您可以像下面这样隐藏列表框的选择https://dev59.com/aXM_5IYBdhLWcg3wZSI6 - Sivakumar
7
我不确定您正在寻找什么,但ItemsControl可能是您需要的东西。 - Jon
Jon,这正是我所需要的。我已经将列表更改为项控件(顺便说一下,我的工具箱中没有显示),现在我的展开器按照我想要的方式工作了。 - naskew
3个回答

29
如果您想要类似列表的能力,但不需要选择能力,则应使用 ItemsControl - 顺便提一下,Selector 的基类就是它,而ListBoxSelector的基类。
整个事情就变成了:
<ItemsControl Width="Auto" ItemsSource="{Binding Measurements}"
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <WrapPanel>
        <TextBlock Text="{Binding Name}" FontWeight="Bold" />
        <TextBlock Text=" "/>
        <TextBlock Text="{Binding Created}"/>
      </WrapPanel>
    </DataTemplate>
 </ItemsControl.ItemTemplate>
</ItemsControl>

显然,在这种情况下,您无法绑定所选项目。


是的,我认为你和Jon说得很对。我需要ItemsControl。 - naskew

1

这是一条有用的信息,我之前没有意识到。

http://msdn.microsoft.com/library/windows/apps/hh780657.aspx

注意,ItemsControl是几个常见集合控件的基类,包括ListView、GridView、FlipView、ListBox和ComboBox控件。这些示例使用ListView和GridView控件,但是这些信息通常适用于ItemsControls。

换句话说,使用ItemsControl确实是解决我的问题的方法,因为使用ListBox,然后尝试禁用突出显示和选择功能,真的会将其转回到它自己的基类。


0

对我来说,最好的解决方案是:

 <Style TargetType="{x:Type ListBoxItem}">
      <Style.Resources>
          <!-- With focus -->
          <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                                 Color="Transparent" />
          <!-- Without focus -->
          <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
                                 Color="Transparent" />
          <!-- Text foreground -->
          <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}"
                                 Color="Black" />
      </Style.Resources>
      <Setter Property="FocusVisualStyle" Value="{x:Null}"></Setter>
</Style>

我几个月前在stackoverflow上找到了它 :)


Mateusz,我猜那可能是一个解决方案,但我更喜欢Jon提出的使用itemscontrol的方法。它可以给我所有需要的行为,而无需禁用我不需要的行为。但还是谢谢你的回复。 - naskew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接