カテゴリを持つWPFでTreeViewを構築しようとしています。Databind複合型とサブツリーTreeViewItemsを混在させたWPF TreeView
基本的な構造は次のようになります。
Root
|_
| Cat A
|_
| Cat B
|_
Cat C
各カテゴリは、別々の観察可能なコレクションにバインドされています。私のカテゴリのほとんどはとてもシンプルです。カテゴリであるTreeViewItemにはItemsSourceが設定されており、階層はありません。しかし、私は特別な階層で表現される必要のあるカテゴリを持っています。上記ツリー内の「猫C」は、このようになっていること
画像:
Servers
|_
| [SERVER A's DISPLAY NAME]
| |_
| | Namespaces
| | |_
| |_ [NAMESPACE alpha's DISPLAY NAME]
| | Deployments
| | |_
| |_ [DEPLOYMENT 1's DISPLAY NAME]
|_ Configuration File
[SERVER B's DISPLAY NAME]
基本的に、私が欲しいのは、静的なヘッダを持っているハードコーディングされた親ツリービューアイテムです。そのアイテムには、名前が表示されたアイテムのコレクションがあります。元の親の各子には、動的な子供のリストを持つ3つの静的項目が必要です。
これを書くと、これは解決するのが非常に単純な問題であると私は考えます。しかし、XAMLで数日間プレイした後は、階層を取得することができません。以下は私が得ることができた最も遠いものです。私は、名前空間、デプロイメント、および設定ファイルを1つのコレクションに入れるために、Childrenという複合コレクションを使用しました。しかし、私はそれらを分離することはできません。あなたがしたい場所マイク、静的およびモデルデータをミキシング
はおそらくあなたを得ることはありません
<TreeViewItem ItemsSource="{Binding Path=Configuration.Servers}"
IsExpanded="True" >
<TreeViewItem.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}">
<Setter Property="IsExpanded" Value="True"/>
</Style>
</TreeViewItem.ItemContainerStyle>
<TreeViewItem.HeaderTemplate>
<DataTemplate>
<Border Margin="0,2,2,0">
<StackPanel Orientation="Horizontal">
<Image Source="/WPF;component/Images/server_chart.png"
Margin="0,0,5,0"/>
<TextBlock Text="Cognos Servers" />
</StackPanel>
</Border>
</DataTemplate>
</TreeViewItem.HeaderTemplate>
<TreeViewItem.Resources>
<HierarchicalDataTemplate ItemSource="{Binding Path=Children}" DataType="{x:Type local:Server}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}" >
<Setter Property="IsExpanded" Value="True"/>
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<TextBlock Text="{Binding DisplayName}" PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Refresh" Click="TreeItemMenu_AddNewClient">
<MenuItem.Icon>
<Image Source="/WPF;component/Images/arrow_refresh.png" />
</MenuItem.Icon>
</MenuItem>
<MenuItem Header="Add Client..." Click="TreeItemMenu_AddNewClient" />
<Separator />
<MenuItem Header="Remove" Click="TreeItemMenu_RemoveClick">
<MenuItem.Icon>
<Image Source="/WPF;component/Images/server_delete.png" />
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Clients}" DataType="{x:Type local:Namespace}">
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}" >
<Setter Property="IsExpanded" Value="True"/>
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<TextBlock Text="{Binding DisplayName}" PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown" />
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type local:Client}">
<TextBlock Text="{Binding DisplayName}"
ContextMenu="{StaticResource ResourceKey=ContextMenuTreeItem}"
PreviewMouseRightButtonDown="OnPreviewMouseRightButtonDown" />
</DataTemplate>
</TreeViewItem.Resources>
あなたは答えが正しいです。私はそこに半分あったと言うことができると思う。私は、分類された見出しのViewModelの作成に抵抗しました。分類された見出しを表すための一般的なモデルを作成した後は、より良い結果が得られました。まだ私が好きではないように清潔ではありませんが、現在は機能しています。 –