データベースオブジェクトのコレクションがあり、それぞれにスキーマオブジェクトとユーザーオブジェクトのコレクションが含まれています。それらをTreeViewにバインドしたいのですが、階層に静的レベルを追加して、結果のTreeViewが多かれ少なかれ次のようになるようにします。
<TreeView>
<TreeViewItem Header="All the databases:">
<TreeViewItem Header="Db1">
<TreeViewItem Header="Here's all the schemas:">
<TreeViewItem Header="Schema1"/>
<TreeViewItem Header="Schema2"/>
</TreeViewItem>
<TreeViewItem Header="Here's all the users:">
<TreeViewItem Header="User1"/>
<TreeViewItem Header="User2"/>
</TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="Db2">
<TreeViewItem Header="Here's all the schemas:">
<TreeViewItem Header="Schema1"/>
<TreeViewItem Header="Schema2"/>
</TreeViewItem>
<TreeViewItem Header="Here's all the users:">
<TreeViewItem Header="User1"/>
<TreeViewItem Header="User2"/>
</TreeViewItem>
</TreeViewItem>
</TreeViewItem>
</TreeView>
次のテンプレートを使用することで、私が望むものにかなり近づくことができました。
<Window.Resources>
<HierarchicalDataTemplate DataType="{x:Type smo:Database}">
<TreeViewItem Header="{Binding Path=Name}">
<TreeViewItem Header="Here's all the schemas:" ItemsSource="{Binding Path=Schemas}"/>
<TreeViewItem Header="Here's all the users:" ItemsSource="{Binding Path=Users}"/>
</TreeViewItem>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type smo:Schema}">
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type smo:User}">
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
</Window.Resources>
次に、コードで次のようにバインディングを設定します。
TreeViewItem treeViewItem = new TreeViewItem();
treeViewItem.Header = "All the databases:";
treeViewItem.ItemsSource = server.Databases;
treeView.Items.Add(treeViewItem);
結果のTreeViewは私が望むように見えますが、特定のスキーマまたはユーザーを選択することはできません。どうやら、WPFは、データベースノードをルートとするサブツリー全体を単一のアイテムと見なし、すべてを選択するだけです。特定のスキーマ、ユーザー、またはデータベースを選択できる必要があります。テンプレートとバインディングを設定して、必要な方法で機能するようにするにはどうすればよいですか?