2011-06-20 4 views
0

Изучение WPF здесь, и я пытаюсь привлечь внимание к привязке иерархических данных.Как добиться привязки иерархических данных?

Это моя ситуация:

public class A 
{ 
    public int Id { ... } 
    public IEnumerable<B> Children { ... } 
} 

public class B 
{ 
    public string SomeValue { ... } 
} 

Я хочу использовать ItemsControl для отображения коллекции A и для каждого из A вхождения Я хочу, чтобы внутренний ItemsControl для отображения A.Children.

Я думал, что это будет делать трюк, но, судя по всему, у меня есть много, чтобы узнать еще ...

<ItemsControl x:Name="icCollectionOfAs" ItemsSource="{Binding}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid Width="auto" Height="auto"> 
       <TextBlock Text="{Binding Id}" /> 
       <ItemsControl ItemsSource="{Binding Children}"> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding SomeValue}" /> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Затем в коде-за ...

icCollectionOfAs.ItemsSource = createSomeAsWithChildBsInThem(); 

Результат все это ничего не показывает. Зачем?

Благодаря

+0

Вы устанавливаете это до или после первого экрана? 'icCollectionOfAs.ItemsSource = createSomeAsWithChildBsInThem();' –

ответ

2

Вы не должны указать ItemsSource как в XAML (ItemsSource="{Binding}") и код (за icCollectionOfAs.ItemsSource = createSomeAsWithChildBsInThem();) XAML, возможно, был вызван позже.

Остальное кажется мне прекрасным, за исключением того, что TextBlock для ID, вероятно, будет скрыт за элементом ItemsControl для детей, поскольку вы используете Grid без строк или столбцов, а не StackPanel.

+0

Хорошо, кажется, я не так далеко от цели, как я сначала считал. Это мой статус atm: 1. Свойство A.Id действительно отображается (спасибо, что указывает на необходимость в строках), поэтому, по-видимому, привязка работает на первом уровне (A). 2. Я все еще не вижу ни одного изображения (B.SomeValue), поэтому второй уровень либо не связан правильно, либо возникает проблема при рендеринге B.SomeValue. –

+0

Просто вопрос, относящийся к этому: Как я понимаю: ItemsSource = "{Binding}" означает, что мне нужно установить DataContext элемента управления, правильно? –

+0

Это не значит, что вам необходимо установить DataContext, DataContext также можно унаследовать, все это означает, что вы привязываетесь к DataContext, это не влечет за собой каких-либо императивов. –

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