2011-06-20 115 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可能被以後調用。

其餘的似乎沒什麼問題,只是對ID將TextBlock可能會ItemsControl的背後隱藏的孩子,你使用網格沒有行或列,而不是一個StackPanel。

+0

好吧,似乎我並沒有像我第一次相信的那樣遙遠。這是我的狀態atm: 1.確實呈現了A.Id屬性(感謝您指出了對行的需求),顯然這個綁定在第一級(A)起作用。 2.我仍然沒有看到任何兒童渲染(B.SomeValue),所以第二個層次要麼沒有被正確綁定,要麼在渲染B.SomeValue時出現問題。 –

+0

只是一個有關這個問題:據我所知:ItemsSource =「{綁定}」意味着我需要設置控件的DataContext,對吧? –

+0

這並不意味着你需要設置DataContext,DataContext也可以被繼承,所有該語句意味着你綁定到DataContext,它不需要任何必要。 –