我想在WPF中建立一個具有類別的TreeView。數據綁定WPF TreeView混合類型和分類的子TreeViewItems
基本上結構是這樣的:
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]
基本上,我要的是硬編碼的父母樹型視圖有一個靜態頭。那麼該項目應該有一個顯示其名稱的項目集合。對於原始父母的每個孩子,應該有三個具有兒童動態列表的靜態項目。
寫出來讓我覺得這應該是一個非常簡單的問題來解決。但是,使用XAML幾天後,我無法獲得層次結構。下面是我能夠得到的最遠的地方。我使用了一個名爲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。在我創建了一個通用模型來表示一個分類標題後,結果更好。仍然不像我喜歡的那樣乾淨,但它現在可以工作。 –