2009-09-20 15 views
6

Mam kontrolkę elementów, która jest powiązana z kolekcją obiektów. Obiekt ma dwie właściwości (nazwę, wartość), które wyświetlam odpowiednio w bloku tekstowym i polu tekstowym. Lista jest dość długa i chciałbym ją pokazać w dwóch kolumnach. Moje pytanie brzmi: czy istnieje sposób, w jaki mogę uzyskać ItemScontrol, aby pokazać swoje przedmioty w dwóch kolumnach?Pokaż elementy w kontrolce items w dwóch kolumnach (WPF)

P.S: Kolekcja jest wypełniana w czasie wykonywania i nie wiem, ile elementów będę musiał pokazać!

Odpowiedz

5

Staram się umieszczać elementy w WrapPanel, a następnie ustawić szerokość panelu tak, aby była 2x szerokość elementu. Daje mi to ładne kolumny z dowolną liczbą elementów. Jeśli szerokość twoich elementów się różni, umieszczam każdy element we własnej siatce lub StackPanel o stałej szerokości.

+0

Dzięki za odpowiedź. Wypróbuję to. Ale podejrzewam, że to zepsuje mój interfejs użytkownika, gdy użytkownik zmieni rozmiar okna/okna. Czy nie jest bardziej elegancki sposób robienia tego? Może przy użyciu siatki w ramach przedmiotu itemcontrol? –

11

Użyj ListBox i określ DataTemplate, w którym umieścisz zarówno TextBlock, jak i TextBox. Użyj powiązań, aby wypełnić je oba. Więcej przykładów można znaleźć na stronie http://msdn.microsoft.com/en-us/library/ms742521.aspx.

<ListBox x:Name="TheListBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" SharedSizeGroup="Key" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Text="{Binding Name}" /> 
       <TextBox Grid.Column="1" Text="{Binding Value }" /> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

TheListBox.ItemsSource = CollectionOfObjects; 
+1

Naprawdę krytycznym (i nieintuicyjnym, czuję) elementem tego wzorca jest SharedSizeGroup. Mówię "nieintuicyjny", ponieważ intuicyjnie myślisz "Chcę wyświetlać moje elementy w siatce", a nie "Chcę wyświetlać moje przedmioty w wielu siatkach, których kolumny zmieniają rozmiar współzależnie." –

+9

Kiedy próbowałem to na ItemsControl (nie ListBox), musiałem ustawić właściwość na ItemsControl: Grid.IsSharedSizeScope = "True", aby to działało. –

Powiązane problemy