Включить разделитель в listbox

Мне нужно включить разделитель между элементами в моем ListBoxItems например где некоторые элементы в моем источнике элементов будут помещены под разделителем, а некоторые над ним .

например :

listboxwithaeparator

вышеуказанное сделано путем изменять ControlTemplate ListBox:

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

проблема в том, что" helpItem " не выбирается, поскольку он не является частью моего ItemsSource.

на данный момент возможность выбора достаточно будет

1) поэтому мой первый вопрос: как я могу связать этот элемент с моим ItemsSource или альтернативно принять его выбор ?

далее больше в будущем я, возможно, не хотел бы иметь больше элементов, которые будут помещены в нижняя половина моего списка

2) как бы я физически разместил разделитель в заданном месте между моими элементами, как бы разделить мой ItemsPresenter в логическом месте ?

1 ответов


вместо ListBox элементы управления, если вы можете разделить свою коллекцию на" n " меньших групп на основе того, сколько вам нужно seperator, вы можете собрать их все вместе через 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 и 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>

который должен производить:

enter image description here

теперь элементы функциональны, и вы можете связать the SelectedItem out и работать с ним, как вы хотите, а также путем проверки SelectedItem против исходной коллекции, вы можете определить, какой список источников в настоящее время выбранный элемент принадлежит.