2013-08-21 9 views
6

Ich muss ein Trennzeichen zwischen Elementen in meinem ListBoxItems einfügen, zum Beispiel wo einige Elemente in meiner Elementquelle unterhalb des Trennzeichens und einige darüber platziert werden.Integrieren eines Trennzeichens in Listbox

Zum Beispiel:

listboxwithaeparator

Die oben durch Änderung des Control des ListBox getan wird:

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

Das Problem ist, dass die "helpItem" get nicht ausgewählt, da es nicht Teil meiner ItemsSource.

Vorerst auswählen zu können, würde es genügen,

1) Also meine erste Frage wäre, wie könnte ich dieses Produkt mit meinem Itemssource assoziieren oder alternativ machen wählbar?

Weiteres in der Zukunft i wan't könnte mehr Einzelteile zu haben, die die untere Hälfte meines listbox in gestellt würden

2) Wie würde ich zwischen meinem Artikel in einem bestimmten Ort, um einen Separator physikalisch platzieren , als ob ich meine ItemsPresenter an einem logischen Ort zu teilen?

+0

Ich hatte das vorher auch. Ich stapelte mehrere Listenfelder und setzte ihre Ränder so, dass sie das Aussehen einer einzelnen Listbox ergaben, aber unter der Oberfläche hatte jedes Pfund seine eigene Items-Quelle. Das einzige knifflige Stück war, die Auswahlgesten so zu koordinieren, dass die Erfahrung des Endbenutzers nur einen ausgewählten Artikel auswählte. –

+0

wollte das irgendwie vermeiden :) –

+0

Wenn Sie ein einzelnes Steuerelement verwenden wollten, gibt es immer noch eine Antwort für Sie: leiten Sie eine Klasse von VirtualizingStackPanel ab und implementieren Sie Ihren eigenen ItemsControlGenerator dafür. Ich habe das vorher auch getan und kann bestätigen, dass es geben wird, wonach Sie suchen. Auf der anderen Seite würde ich das Schreiben einer ICG nicht als eine ganz angenehme Erfahrung bezeichnen. :) –

Antwort

8

Statt mehrere ListBox Kontrollen, wenn Sie Ihre Sammlung spalten könnte „n“ kleinere Gruppen auf, wie viele seperator die Sie benötigen, können Sie sie alle zusammen über eine CompositeCollection in die gleiche ListBox

So zum Beispiel setzen sagen, ich habe:

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

und ich mag den seperator zwischen CollA und CollB, dann könnte mein xAML sein:

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

, die produzieren sollte: erfassen, indem die Überprüfung der SelectedItem gegen die Quelle-Sammlung, können Sie mit den SelectedItem und arbeiten binden, wie Sie wünschen und auch

enter image description here

Jetzt funktionale Elemente sind und Sie können zu welcher Quellenliste das aktuell ausgewählte Element gehört.

+0

Das klingt großartig, ich werde es ausprobieren –