2009-02-26 7 views
0

SQLクエリの結果としてDataSetがある場合は、直接TreeViewにバインドしてデータの階層を表示できますか?私はいくつかのHierarchicalDataTemplatesを使用しなければならないことは分かっていますが、どのデータをどのように表示するのかはわかりません。どのようにしてデータセットをTreeView(階層あり)に直接バインドできますか?

私はそうのように、4レベルの階層を持っている場合は、次のデータセットから直接、自分のデータを表示するように設定する必要がどのような性質(IES)

<HierarchicalDataTemplate x:Key="FirstLevelTemplate" ItemTemplate="{StaticResource SecondLevelTemplate}"/> 
<HierarchicalDataTemplate x:Key="SecondLevelTemplate" ItemTemplate="{StaticResource ThirdLevelTemplate}"/> 
<HierarchicalDataTemplate x:Key="ThirdLevelTemplate" ItemTemplate="{StaticResource FourthLevelTemplate}"/> 
<DataTemplate x:Key="FourthLevelTemplate"/> 

編集:理想的には、私はこれを1つの自己参照型データテーブルを使用して行いたいと思います。

答えて

1

私はあなたがそれを行うことができるとは思いません。

TreeviewコントロールとHierarchicalDataTemplateは、オブジェクトの階層を必要とします。 DataSetは本質的にフラットです。

あなたは何とかそのデータセットをオブジェクトの階層に変換しなければなりません。それぞれに独自の "子"コレクションがあります。ツリービューのItemsSourceは、 "トップレベルのコレクション"(親参照のない行)にバインドされます。

各HierarchicalDataTemplateのItemsSourceプロパティは、対応するChildrenプロパティにバインドされます。

コンバーターを使用する解決策があるかもしれませんが、存在する場合、バインドする前にデータをまっすぐに再形成するより複雑になる可能性があります。

+0

私はプログラムでTreeViewItemsの階層を作成してしまいましたが、それはうまくいくようでした(おそらくベストプラクティスではありませんが)。ありがとう! – Pwninstein

0

まず、TreeViewのItemsSourceをDataSetに設定します。

次に、TreeViewのItemTemplateをFirstLevelTemplateに設定します。

ItemTemplate="{StaticResource FirstLevelTemplate}" 

第1テンプレートは、第2レベルテンプレートを使用するアイテムを参照する必要があります。子項目が含まれているデータセット内のプロパティを参照するために、

<HierarchicalDataTemplate x:Key="FirstLevelTemplate" ItemsSource="{Binding ChildItems}" ItemTemplate="{StaticResource SecondLevelTemplate}"/> 

変更「ChildItems」:そのようなこの階層テンプレートにアイテムのソースを追加します。各HierarchicalDataTemplateに対してこれを繰り返します。

最後に、データを表示するためにDataTemplateにコントロールを追加する必要があります。簡単な例を次に示します:

<DataTemplate x:Key="FourthLevelTemplate"/> 
    <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="3"> 
     <TextBlock Text="{Binding DataProperty}" 
       HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    </Border> 
</DataTemplate> 

この場合、 "DataProperty"をデータフィールドのプロパティ名に置き換えます。追加のデータを表示するために、他のコントロール(TextBox、ComboBoxなど)を追加することができます。

+0

第2レベルの子のコントロールテンプレートを設定する方法はありますか? – Echilon

+0

私の提案は、各レベルのHierarchicalDataTemplateを作成することでした。 2番目のレベルは "SecondLevelTemplate"のようなものです。このテンプレートのコントロールは、2番目のレベルで表示されます。 "ControlTemplate"が必要な場合は、DataTemplateでControlを使用し、その上にTemplateプロパティを設定します。 –

1

このサイトには、ツリービューを使用した非常に良い例がいくつかあります。

BeaStollnitz

関連する問題