listbox wpf
Incorporar un separador en listbox (1)
Necesito incorporar un separador entre elementos en mi ListBoxItems, por ejemplo, donde algunos elementos en mi fuente de elementos se colocarían debajo del separador y algunos encima.
Por ejemplo :
Lo anterior se hace alterando el ControlTemplate del ListBox:
<ScrollViewer>
<StackPanel>
<ItemsPresenter />
<Separator BorderBrush="Red" />
<ListBoxItem Content=".." ContentTemplate="..." x:Key="helpItem"/>
</StackPanel>
</ScrollViewer>
El problema es que el "elemento de ayuda" no se selecciona, ya que no forma parte de ItemsSource.
Por ahora, ser capaz de seleccionarlo sería suficiente
1) Entonces, mi primera pregunta sería ¿cómo puedo asociar este elemento con mi ItemsSource o, alternativamente, hacer que sea seleccionable?
Además, en el futuro podría querer tener más elementos que se colocarían en la mitad inferior de mi listbox
2) ¿Cómo colocaría físicamente un Separador en un lugar determinado entre mis elementos, como si dividiera mi ItemsPresenter en un lugar lógico?
En lugar de múltiples controles ListBox
, si puede dividir su colección en "n" grupos más pequeños en función de la cantidad de separadores que necesita, puede juntarlos a través de una CompositeCollection
en el mismo ListBox
Entonces, por ejemplo, decir que tengo:
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;
}
}
y quiero el CollA
entre CollA
y CollB
, entonces mi xaml podría ser:
<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>
que debería producir:
Ahora los elementos son funcionales y puede vincular el SelectedItem
y trabajar con él como lo desee y también al verificar el SelectedItem contra la colección de origen, puede detectar a qué lista de fuente pertenece actualmente el elemento seleccionado.