2011-06-20 9 views
0

ここでWPFを学ぶと、私は階層的なデータバインディングの周りに頭を抱えようとしています。どのように階層的なデータバインディングを達成するには?

これが私の状況です:

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

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

私はAのコレクションを表示するためにItemsControlを使用したいとAのそれぞれのoccuranceのために、私はA.Childrenを表示するための内部ItemsControlをしたいです。

私は

icCollectionOfAs.ItemsSource = createSomeAsWithChildBsInThem(); 

結果の...コードビハインドで、その後

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

...どうやら、私はまだ学ぶことがたくさん持っている、これはトリックを行うだろうと思ったが、これは何も表示されません。どうして?

おかげ

+0

画面が最初に表示される前または後にこれを設定しますか? icCollectionOfAs.ItemsSource = createSomeAsWithChildBsInThem(); ' –

答えて

2

あなたは、XAML(ItemsSource="{Binding}")にし、背後にあるコード(icCollectionOfAs.ItemsSource = createSomeAsWithChildBsInThem();)XAMLは後で呼ばれている可能性があります両方のItemsSourceを指定しないでください。

残りは、StackPanelではなく行または列なしでグリッドを使用するため、IDのTextBlockが子のItemsControlの背後に隠れていることを除いて、私にとってはうれしいようです。

+0

私が最初に信じたように、私は目標から離れていないようです。これは私のステータスatmです: 1.本当にA.Idプロパティがレンダリングされています(行の必要性を指摘してくれてありがとう)ので、バインディングは最初のレベル(A)で動作します。 2.レンダリングされた子(B.SomeValue)がまだ表示されないので、2番目のレベルが正しくバインドされていないか、B.SomeValueをレンダリングするときに問題があります。 –

+0

ちょうどこれに関する質問:私が理解しているように:ItemsSource = "{Binding}"は、コントロールのDataContextを設定する必要があることを意味します。 –

+0

DataContextを設定する必要があるわけではなく、DataContextを継承することもできます。つまり、DataContextにバインドすることを意味するすべての命令は必須ではありません。 –

関連する問題