2013-08-21 30 views
6

Tôi cần kết hợp dấu phân tách giữa các mục trong ListBoxItems của tôi ví dụ trong đó một số mục trong nguồn mục của tôi sẽ được đặt bên dưới dấu tách và một số ở trên dấu phân tách.Kết hợp dấu tách trong hộp danh sách

Ví dụ:

listboxwithaeparator

Trên đây được thực hiện bằng cách thay đổi ControlTemplate của ListBox:

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

Vấn đề là rằng "helpItem" không được chọn vì nó là không phải là một phần của ItemsSource của tôi.

Còn bây giờ việc có thể để chọn nó sẽ đủ

1) Vì vậy, câu hỏi đầu tiên của tôi sẽ là làm thế nào tôi có thể kết hợp mặt hàng này với ItemsSource tôi hoặc cách khác làm cho nó thể lựa chọn?

Hơn nữa trong tương lai tôi có thể wan't để có nhiều mặt hàng mà sẽ được đặt trong nửa dưới của hộp danh sách của tôi

2) Làm thế nào tôi sẽ thể chất đặt một tách ở một nơi nhất định giữa các mục của tôi , như để chia ItemsPresenter của tôi ở vị trí hợp lý?

+0

Tôi đã có điều này trước đây. Tôi xếp chồng lên nhau nhiều hộp danh sách và đặt đường viền của chúng sao cho nó xuất hiện * của một hộp danh sách duy nhất, nhưng bên dưới bề mặt mỗi lb có nguồn mục riêng của nó. Bit khó khăn duy nhất là phối hợp các cử chỉ lựa chọn sao cho trải nghiệm của người dùng cuối chỉ thấy một mục được chọn. –

+0

kinda muốn tránh điều đó :) –

+0

Nếu bạn muốn sử dụng một điều khiển duy nhất, vẫn còn một câu trả lời cho bạn: lấy được một lớp từ VirtualizingStackPanel và triển khai ItemsControlGenerator của riêng bạn cho nó. Tôi đã làm điều đó trước khi và có thể chứng thực nó sẽ cung cấp cho những gì bạn đang sau. Mặt khác, tôi sẽ không viết một ICG như một trải nghiệm hoàn toàn dễ chịu. :) –

Trả lời

8

Thay vì nhiều ListBox điều khiển, nếu bạn có thể chia bộ sưu tập của bạn để "n" nhóm nhỏ dựa trên bao nhiêu seperator của bạn cần, bạn có thể đặt chúng lại với nhau thông qua một CompositeCollection vào cùng ListBox

Vì vậy, ví dụ nói rằng tôi có:

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

và tôi muốn seperator giữa CollACollB, sau đó XAML của tôi có thể là:

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

mà nên sản xuất:

enter image description here

Bây giờ mục là chức năng và bạn có thể ràng buộc SelectedItem ra và làm việc với nó như bạn mong muốn và cũng bằng cách kiểm tra SelectedItem chống lại các nguồn thu, bạn có thể phát hiện danh sách nguồn hiện được chọn thuộc về.

+0

Nghe hay đấy, tôi sẽ thử –