2013-08-21 20 views
6

Potrzebuję włączyć separator między elementami w moich obiektach ListBoxItems, na przykład , gdzie niektóre elementy w moim źródle elementów zostaną umieszczone pod separatorem, a niektóre nad nim.Zawiera separator w polu listy

Na przykład:

listboxwithaeparator

Powyższe odbywa się poprzez zmianę ControlTemplate z ListBox:

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

Problemem jest to, że "helpItem" nie uzyskać wybrany, ponieważ jest nie jest częścią mojego ItemsSource.

Na razie jest w stanie wybrać wystarczyłoby

1) Tak więc moje pierwsze pytanie byłoby jak mogłem skojarzyć ten przedmiot z moim ItemsSource lub alternatywnie sprawiają, że do wyboru?

Co więcej w przyszłości i może wa mieć więcej elementów, które zostaną umieszczone w dolna połowa mojego listbox

2) jaki byłby fizycznie umieścić separator w danym miejscu między moje przedmioty , jak gdyby podzielić mój ItemsPresenter w miejscu logicznym?

+0

Miałem to również przed. Układałem wiele listboxów i ustawiałem ich granice tak, aby nadawały * wygląd * pojedynczego pola listy, ale pod powierzchnią każdego lb znajdowało się własne źródło przedmiotów. Jedynym trudnym zadaniem było koordynowanie gestów selekcji tak, aby użytkownik "doświadczony" widział tylko jeden wybrany element. –

+0

jakby chciał tego uniknąć :) –

+0

Jeśli chciałbyś użyć pojedynczej kontrolki, wciąż masz dla ciebie odpowiedź: wypróbuj klasę z VirtualizingStackPanel i zaimplementuj dla niej swój własny ItemControlGenerator. Zrobiłem to wcześniej i mogę potwierdzić, że da ci to, czego szukasz. Z drugiej strony, nie zapisałbym ICG jako całkowicie przyjemnego doświadczenia. :) –

Odpowiedz

8

Zamiast wielu ListBox kontroli, jeśli można podzielić swoją kolekcję do „n” mniejsze grupy na podstawie ilu Separator użytkownika trzeba, można umieścić je wszystkie razem poprzez CompositeCollection do tego samego ListBox

Tak na przykład że mam:

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

i chcę separator pomiędzy CollA i CollB, wtedy mój XAML może być:

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

które powinny produkować:

enter image description here

Teraz elementy są funkcjonalne i można powiązać SelectedItem się i pracować z nim, jak chcesz, a także sprawdzając SelectedItem przed źródłowego kolekcji można wykryć do której należy aktualnie wybrany element źródłowy.

+0

Brzmi świetnie, wypróbuję to –