2009-07-31 75 views
3

我有兩個類,我想在樹視圖中顯示。如何在不同類型的嵌套對象中使用wpf樹視圖

在我的主窗口中,我有一個可觀察的某個類型的對象集合,稱它爲對象a。 對象a包含另一種類型的對象的可觀察集合,對象b。 每個對象b包含一個可觀察的對象b的集合。

例如,我可能有一些看起來像這樣

ListOfObjectA的

-ObjectA1

--ListOfObjectB的

---對象B

---- ListOfObjectB的

----- ObjectB

-ObjectA2

--ListOfObjectB的

---對象B

我應該我的XAML模樣到TreeView綁定到類似的東西?

對不起,如果我沒有解釋得很好,我是新來的wpf。

回答

6

RB有正確的想法。這就是WPF將模板應用於普通.NET對象的能力變得非常強大的地方。

您需要指定兩個HierarchicalDataTemplates,一個用於a類型的對象,另一個用於b類型的對象。事情是這樣的:

<TreeView> 
    <TreeView.Resources> 
     <HierarchicalDataTemplate TargetType="{x:Type local:a}"> 
      <!-- XAML to display objects of type a --> 
     </HierarchialDataTemplate> 
     <HierarchicalDataTemplate TargetType="{x:Type local:b}"> 
      <!-- XAML to display objects of type b --> 
     </HierarchicalDataTemplate> 
    </TreeView.Resources> 
</TreeView> 

你需要讓WPF知道在哪裏可以得到孩子從對象到指定每個模板的ItemsSource屬性綁定。另外,您需要向根節點添加一個xmlns聲明,以指定對象所在的名稱空間(由上面示例代碼中的local表示)。

1

我知道足夠多的WPF是非常危險的,但我很確定HierarchicalDataTemplate是解決您的問題的方法。我的XAML技能很差,所以我無法爲您編寫好的示例代碼。以下是我在項目中使用HierarchicalDataTemplate的方法。我希望這給你一些好點子。

<TreeView Grid.Row="1" 
      Grid.Column="1" 
      ItemsSource="{Binding Children}" 
      SelectedItemChanged="TreeView_SelectedItemChanged" 
      ContextMenu="{StaticResource MenuContextMenu}"> 

    <TreeView.ItemTemplate> 
    <HierarchicalDataTemplate ItemsSource="{Binding Children}" > 
     <!--<TextBlock Text="{Binding Path=ItemName}" Margin="5,0,5,0" />--> 
     <Grid ContextMenu="{StaticResource ContextMenu}" > 
     <TextBlock Name="ShownItem" 
          Text="{Binding Path=ItemName}" 
          Margin="0,0,0,0" /> 

      <TextBox Name="EditBox" 
       Text="{Binding Path=ItemName}" 
       Visibility="{Binding Path=Visibility}" 
       Style="{StaticResource EditableTextBox}" 
       IsVisibleChanged="EditBox_IsVisibleChanged" 
       PreviewKeyDown="EditBox_KeyDown" 
       Margin="0,2,0,2" 
        > 

       </TextBox> 

     </Grid> 
    </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 
相關問題