2012-01-13 3 views
0

Я пытаюсь связать свойство ObservableCollection<ObservableCollection<Location>> с ListBox с ItemTemplate ListBox, который в свою очередь имеет ItemTemplate, который является сеткой. Макет списка в списке лучше работает. Однако у меня возникают проблемы с моей привязкой данных.ListBox ListBoxes, связанный с коллекцией коллекций

Для второго слоя listbox ItemsSource Я попытался привязку с использованием привязки текущего текущего объекта ItemSource="{Binding /}" и используя ItemsSource="{TemplateBinding /}". Я новичок в WPF и использую MVVM, поэтому любые советы и/или критику ценятся.

<ListBox Grid.Row="4" Width="610" Height="600" HorizontalContentAlignment="Stretch" ItemsSource="{Binding CurrentLocation.Children}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ListBox Width="550" Height="100" Margin="5" HorizontalContentAlignment="Stretch" ItemsSource="{Binding /}" > 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <Grid HorizontalAlignment="Stretch" Margin="5"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*" /> 
           <ColumnDefinition Width="3*" /> 
           <ColumnDefinition Width="*" /> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*" /> 
           <RowDefinition Height="*" /> 
          </Grid.RowDefinitions> 
          <TextBlock Grid.Column="0" Grid.Row="0" Margin="5" Text="Name:" /> 
          <TextBlock Grid.Column="0" Grid.Row="1" Margin="5" Text="Description:" /> 
          <TextBlock Grid.Column="1" Grid.Row="0" Margin="5" Text="{Binding Name}" /> 
          <TextBlock Grid.Column="1" Grid.Row="1" Margin="5" Text="{Binding Description}" TextWrapping="Wrap" /> 
          <Button Grid.Column="2" Grid.Row="0" Command="{Binding TODO}"> 
           <TextBlock Text="Edit"/> 
          </Button> 
          <Button Grid.Column="2" Grid.Row="1" Command="{Binding TODO}"> 
           <TextBlock Text="Delete"/> 
          </Button> 
         </Grid> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

Зачем вам нужен ListBox, содержащий ListBoxes? – Bernard

ответ

1

Каждого ListBoxItem содержит DataContext из любого объекта в родительской коллекции, так что вы должны быть в порядке, чтобы не задавать ничего в связывании.

<ListBox ItemsSource="{Binding MyCollectionOfCollections}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <!-- DataContext of each item will an inner ObservableCollection<Location> --> 
      <ListBox ItemsSource="{Binding }" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

Ах, да. Я застрял у меня в голове, что мне нужно было пойти еще на один уровень, чтобы добраться до этого второго списка. Спасибо за указание на это! – scuba88

1

Правильное обозначение для привязки к текущему DataContext в целом {Binding}.

<ListBox ... ItemsSource="{Binding CurrentLocation.Children}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ListBox ... ItemsSource="{Binding}" > 
       <ListBox.ItemTemplate> 
        <DataTemplate> 
         <Grid HorizontalAlignment="Stretch" Margin="5"> 
          <!-- snip --> 
         </Grid> 
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

Я думаю, Рейчел избил тебя. Однако, спасибо! – scuba88

+0

Нет, я был на 28 секунд быстрее (и только что открыл еще одну полезную функцию на этом сайте) ... Но на этот раз я позволю ей уйти с ней;) – Nuffin

+0

@Tobias Вы были на 28 секунд быстрее меня, поэтому +1 от меня :) Я думаю, что был бы быстрее, если бы я только что разместил образец кода, но я хотел включить объяснение, почему привязки работали, поэтому нужно было подумать минуту. – Rachel

Смежные вопросы