有没有选择的WPF列表视图?

时间:2013-07-25 08:08:44

标签: wpf wpf-controls

我正在开发的应用程序有一种由扩展器组成的手风琴,但每个扩展器独立运行,而不是一次只允许一个打开的项目。每个扩展器都与视图模型中集合中的项目相关。

我目前的解决方案是使用列表框,然后将列表itemsource绑定到集合,并让项目模板呈现扩展器和扩展器内容。

问题是列表框将每个扩展器视为一个项目(显然),并允许选择和突出显示。突出显示有点难看,可能会被禁用,但选择会导致一些问题,因为它会导致列表滚动显示尽可能多的扩展扩展器。

是否有一个类似于stackpanel(可能)的WPF控件允许我使用项目模板绑定包含的控件但没有选择和突出显示?

enter image description here

            <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>

3 个答案:

答案 0 :(得分:22)

如果你想要没有选择功能的类似List的功能,你应该使用ItemsControl - 顺便使用Selector的基类,而ListBox的基类又是<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> 的基类

然后整个事情就变成了

{{1}}

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

答案 1 :(得分: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发现了它:)

答案 2 :(得分:0)

这是我没有意识到的有用信息。

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

  

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

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