2012-03-15 4 views
0

私は現在約5時間にわたってレスリングしている次の問題があります。ツリービューバインディング(バインドされたノードの間に 'Folder'があります)

次のクラス構造をTreeViewに正しくバインドするにはどうすればよいですか?

- Person #1 
|-- Cars 
    |-- Car #1 
    |-- Car #2 
|-- Houses 
    |-- House #1 
- Person #2 
|-- Houses 
    |-- House #1 
    |-- House #2 

(パーソン#1は、住宅や自動車、人物#2だけ持って家の両方を有する場合) 地球上であなたにこれを行う方法:

public class Person 
{ 
    public string Display { get; set; } 
    public List<Car> Cars { get; set; } 
    public List<House> Houses { get; set; } 
} 

public class Car 
{ 
    public string Display { get; set; } 
} 

public class House 
{ 
    public string Display { get; set; } 
} 

私はTreeViewコントロールには、次の構造を持つようにしたいですXAMLでObservableCollectionへの自動データバインディングを使用していますか?

this.ItemsSource = SomeStaticClass.People; 

ヘルプは非常に非常に高く評価されています は、私はこのような私のツリービューのコンストラクター(ユーザーコントロール)に一度だけバインド設定しました! ありがとう! =)

EDIT: 私はHierarchicalDataTemplateを試してみましたが、私はそれを動作させることはできません。)

EDIT2:私は多くの多くの異なるものを試してみましたが、私が来た最も近いと(コードに従っていますこの時点での心の中で一つだけ列挙;)):

<HierarchicalDataTemplate DataType="{x:Type e:Person}" ItemsSource="{Binding Cars}"> 
    <TextBlock Text="{Binding Display}" /> 
    <HierarchicalDataTemplate.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Cars}"> 
      <TextBlock Text="Cars" /> 
      <HierarchicalDataTemplate.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding Display}" /> 
       </DataTemplate> 
      </HierarchicalDataTemplate.ItemTemplate> 
     </HierarchicalDataTemplate> 
    </HierarchicalDataTemplate.ItemTemplate> 
</HierarchicalDataTemplate> 

残念ながら、それはTextBlockの車と車の人自身は表示されません。それ、どうやったら出来るの?

+0

['HierarchicalDataTemplate'](http://msdn.microsoft.com/en-us/library/system.windows.hierarchicaldatatemplate.aspx)を試してみましたか? –

+0

はい、私はこのテンプレートですべてを試しました。それは動作しません、私は何を試しても問題ではありません。 :) – Shion

+0

あなたのテンプレートコードを表示 –

答えて

0

最後に解決されました。 私はちょうどこのように私の人と車(それぞれホーム。)との間にクラスの別のコレクション挿入:

public class CollectionHolder<T> : IEnumerable 
{ 
    public List<T> Items { get; set; } 
    public string Display { get; set; } 

    private List<CollectionHolder<T>> self; 
    public CollectionHolder() 
    { 
     self = new List<CollectionHolder<T>>(); 
     self.add(this); 
    } 

    public IEnumerator GetEnumerator() 
    { 
     return self.GetEnumerator(); 
    } 
} 

そして、Personクラスより:

public class Person 
{ 
    public string Display { get; set; } 
    public CollectionHolder<Car> Cars { get; set; } 
    public CollectionHolder<House> Houses { get; set; } 

    public IList Children 
    { 
     get 
     { 
      return new CompositeCollection 
       { 
        new CollectionContainer { Collection = Cars }, 
        new CollectionContainer { Collection = Houses } 
       });//In real world: don't generate the list everytime! 
     } 
    } 
} 

そして最後に私のXAML:

<TreeView x:Name="trvData" Grid.Row="0" BorderThickness="0,0,0,1"> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type e:Person}" ItemsSource="{Binding Children}"> 
       <TextBlock Text="{Binding Display}" /> 
       <HierarchicalDataTemplate.ItemTemplate> 
        <HierarchicalDataTemplate ItemsSource="{Binding Items}"> 
         <TextBlock Text="{Binding Display}" /> 
         <HierarchicalDataTemplate.ItemTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding Display}" /> 
          </DataTemplate> 
         </HierarchicalDataTemplate.ItemTemplate> 
        </HierarchicalDataTemplate> 
       </HierarchicalDataTemplate.ItemTemplate> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 
+0

正しい答えとしてマーク –

+0

私は明日、正しいものが1日であるので、あなた自身の答えをマークするための待ち時間(多分ちょうど私のような低ポインタのため)を思い出します。 – Shion

+0

本当にコンポジットコレクションが必要ですか?通常、あなたはそれらの間に何も置かずにコレクションを集めるためにそれを使用します(あなたの 'Cars'や' Houses'フォルダのように) –

関連する問題