2012-03-29 15 views
1

ListViewにデータを表示する必要がある別のObservableCollectionが含まれているObservableCollectionへのバインディングを使用して作成されたListViewコントロールを作成しようとしています。次のように私は、オブジェクト階層を持って明確にするネストされたObservableCollectionsのデータバインディングのデータテンプレート

ClassA 
{ 
    int ID = 123; 
    string Name = "Value"; 
} 

ClassB 
{ 
    int ID = 456; 
    ObservableCollection<ClassA> CollectionOfClassA; 
} 

ClassC 
{ 
    int ID = 789; 
    ObservableCollection<ClassB> CollectionOfClassB; 
} 

このことから私は、以下のリストビューのレイアウトで終わるしたい:私は私が必要と仮定しますこれを実現するために

(ClassC.CollectionOfClassB ListView) 
+-------------+-------------+------------------+--------------------------------+ 
| ClassB.ID | CollectionOfClassA.ClassA.ID | CollectionOfClassA.ClassA.ID | 
+-------------+-------------+------------------+--------------------------------+ 
| ClassB.ID | CollectionOfClassA.ClassA.ID | CollectionOfClassA.ClassA.ID | 
+-------------+-------------+------------------+--------------------------------+ 

しかし、ListViewを自分のCollectionOfClassBコレクションにバインドするには、datatemplate構造体とそれに続く行を生成するためのバインドが少し不便です。

誰も私の助けてくれますか?

多くのおかげで、

編集:

上記の表の最初の列はClassC.CollectionOfClassBコレクション内のインデックス付きオブジェクトのIDフィールドを参照し、各列はに格納されている個々のオブジェクトでありますCollectionOfClassB。

CollectionOfClassBに格納されている各ClassBオブジェクトには、独自のCollectionOfClassAがあります。これは、親と同じ行のlistviewに配置しようとしています。 CollectionOfClassAの各ClassAオブジェクトは列です。

編集2:最初の列はCollectionOfClassBにおける現在のアイテムのためのClassBのからIDフィールドによって取り込まれ

、後続の列はCollectionOfClassAの各項目のデータが取り込まれます。列ヘッダーはClassA.IDになりますが、コンテンツはClassA.Nameなどになります。

私はこれを実現するためのXAMLマークアップを探しています。

+0

をソートするように内蔵されたGridViewの機能を使用していません。行の中にサブグリッドのようなものを表示するつもりですか? –

+0

@VitorCanova私が達成しようとしていることをうまく明確にするために私の元の投稿を編集しました。 – Unflux

+0

この例では、繰り返し列があります。 – Paparazzi

答えて

1

あなたはClassB.CollectionOfClassAが常に同じ長さであることがわかっている場合、あなたはそれ

のインデックス付きの値にバインドすることができますここでは、列の動的な数を持っている場合、それはなりラフ例

<!-- Assumes DataContext is ClassC --> 
<ListView ItemsSource="{Binding CollectionOfClassB}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn DisplayMemberBinding="{Binding Id}" Header="ClassB.Id" /> 
      <GridViewColumn DisplayMemberBinding="{Binding CollectionOfClassA[0].Id}" Header="ClassA[0].Id" /> 
      <GridViewColumn DisplayMemberBinding="{Binding CollectionOfClassA[1].Id}" Header="ClassA[1].Id" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

です最も簡単な方法は、カスタム列を使用し、水平StackPanel

のようなもので項目を表示することです

トリッキービットもちろん

<!-- Assumes DataContext is ClassC --> 
<ListView ItemsSource="{Binding CollectionOfClassB}"> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn DisplayMemberBinding="{Binding Id}" Header="ClassB.Id" /> 
      <GridViewColumn Header="CollectionOfA" 
       <GridViewColumn.CellTemplate> 
        <DataTemplate> 
         <ItemsControl ItemsSource="{Binding CollectionOfClassA}"> 
          <ItemsControl.ItemsPanelTemplate> 
           <StackPanel Orientation="Horizontal" /> 
          </ItemsControl.ItemsPanelTemplate> 

          <ItemsControl.ItemTemplate> 
           <TextBlock Text="{Binding Id}" Width="50" /> 
          </ItemsControl.ItemTemplate> 
         </ItemsControl> 
        </DataTemplate> 
       </GridViewColumn.CellTemplate> 
     </GridView> 
    </ListView.View> 
</ListView> 

、これはあなたがCollectionOfClassAを表示しようとする場所を示さなかったあなたの例では

関連する問題