2011-11-08 58 views
3

我想在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> 

回答

3

麥克,

混合靜態和模型數據可能要在其中不會得到你。您必須創建一個包含靜態節點的實際ViewModel等。 我強烈建議Josh Smith's TreeView ViewModel tutorials。這是第一個,但四處尋找更多的信息。他是這方面最有知識的開發人員之一。根據他的建議我們取得了巨大成功。

+0

你的回答是正確的。我想我可以說我是在那裏的一半。我拒絕爲分類標題創建一個ViewModel。在我創建了一個通用模型來表示一個分類標題後,結果更好。仍然不像我喜歡的那樣乾淨,但它現在可以工作。 –