2013-08-21 15 views
6

Ho bisogno di incorporare un separatore tra gli elementi nel mio ListBoxItems ad esempio dove alcuni elementi nella mia fonte di articoli sarebbero posizionati sotto il separatore e alcuni sopra di esso.Incorporare un separatore nella casella di riepilogo

Ad esempio:

listboxwithaeparator

Quanto sopra è fatto alterando la ControlTemplate del ListBox:

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

Il problema è che il "helpItem" non essere selezionato dal momento che è non fa parte del mio ItemsSource.

Per ora essere in grado di selezionare basterebbe

1) Quindi la mia prima domanda sarebbe come potrei associare questo articolo con la mia ItemsSource o in alternativa renderlo selezionabile?

ulteriormente più in futuro potrei wan't per avere più elementi che verrebbero messi in metà inferiore della mia casella di riepilogo

2) Come potrei fisicamente mettere un separatore in un dato luogo tra i miei oggetti , come se dovessi dividere il mio ItemPresenter in un punto logico?

+0

Ho avuto anche questo prima. Ho accatastato più listbox e impostato i loro bordi in modo tale da dare l'* aspetto * di una singola listbox, ma al di sotto della superficie ogni lb aveva la propria fonte di elementi. L'unica cosa difficile era coordinare i gesti di selezione in modo che l''esperienza' dell'utente finale vedesse solo un elemento selezionato. –

+0

kinda voleva evitare che :) –

+0

Se si desidera utilizzare un singolo controllo, c'è ancora una risposta per voi: derivare una classe da VirtualizingStackPanel e implementare il proprio ItemsControlGenerator per esso. L'ho fatto anche prima e posso attestare che darà quello che cerchi. Al rovescio della medaglia, non metterei scritto un ICG come un'esperienza del tutto piacevole. :) –

risposta

8

Invece di molteplici ListBox controlli, se si potesse dividere la vostra collezione di "n" gruppi più piccoli in base a quanti separatore di cui avete bisogno, potete metterli tutti insieme tramite un CompositeCollection nella stessa ListBox

Così, per esempio Dire che ho:

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

e voglio il separatore tra il CollA e CollB, poi il mio XAML potrebbe essere:

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

che dovrebbe produrre:

enter image description here

Ora elementi sono funzionali e si può associare il SelectedItem fuori e lavorare con esso come si desidera e anche controllando la SelectedItem contro la sorgente di raccolta, è possibile rilevare a quale elenco di sorgenti attualmente selezionato appartiene.

+0

Sembra fantastico, lo proverò –

Problemi correlati