7

我需要在我的 ListBoxItems 中的项目之间合并一个分隔符,例如,我的项目源中的一些项目将放置在分隔符下方和一些上方。

例如 :

带分隔符的列表框

以上是通过改变 ListBox 的 ControlTemplate 来完成的:

 <ScrollViewer>
     <StackPanel>
         <ItemsPresenter />                                        
         <Separator  BorderBrush="Red"  />
         <ListBoxItem Content=".." ContentTemplate="..."  x:Key="helpItem"/>                                    
     </StackPanel>
 </ScrollViewer>

问题是“helpItem”没有被选中,因为它不是我的 ItemsSource 的一部分。

现在能够选择它就足够了

1)所以我的第一个问题是我如何将这个项目与我的 ItemsSource 相关联,或者让它可选择?

将来我可能不想有更多的项目放在我的列表框的下半部分

2)我如何将分隔符物理放置在我的项目之间的给定位置,就好像将我的 ItemsPresenter 划分在一个合乎逻辑的位置?

4

1 回答 1

9

ListBox如果您可以根据需要多少分隔符将集合拆分为“n”个较小的组,而不是多个控件,则可以通过 a 将它们全部放在CompositeCollection同一个中ListBox

所以例如说我有:

public partial class MainWindow : Window {
  public List<string> CollA { get; set; }
  public List<string> CollB { get; set; }
  public MainWindow() {
    InitializeComponent();

    CollA = new List<string> {"A", "B", "C"};

    CollB = new List<string> {"D", "E", "F"};

    DataContext = this;
  }
}

CollA我想要and之间的分隔符CollB,那么我的 xaml 可能是:

<ListBox>
  <ListBox.Resources>
    <CollectionViewSource x:Key="CollectionOne"
                          Source="{Binding CollA}" />
    <CollectionViewSource x:Key="CollectionTwo"
                          Source="{Binding CollB}" />
  </ListBox.Resources>
  <ListBox.ItemsSource>
    <CompositeCollection>
      <CollectionContainer Collection="{Binding Source={StaticResource CollectionOne}}" />
      <ListBoxItem HorizontalContentAlignment="Stretch"
                    IsEnabled="False"
                    IsHitTestVisible="False">
        <Rectangle Height="2"
                    Fill="Gray" />
      </ListBoxItem>
      <CollectionContainer Collection="{Binding Source={StaticResource CollectionTwo}}" />
    </CompositeCollection>
  </ListBox.ItemsSource>
</ListBox>

这应该产生:

在此处输入图像描述

现在项目是功能性的,您可以根据需要绑定SelectedItem输出并使用它,还可以通过根据源集合检查 SelectedItem,您可以检测当前选定项目属于哪个源列表。

于 2013-08-21T13:11:30.820 回答