2010-01-30 162 views
15

說我有一棵二叉樹,其中數據結構的根只是一個樹節點。對於每個節點,都可以通過Children屬性訪問子節點。這是我的嘗試。 TreeRoot是繼承的數據上下文的屬性,但它是單個節點(不是集合)。我可以將WPF TreeView綁定到單個根節點嗎?

<UserControl.Resources> 
    <HierarchicalDataTemplate x:Key="TreeNodeTemplate" ItemsSource="{Binding Children}"> 
     <TextBlock Text="{Binding Name}" /> 
    </HierarchicalDataTemplate> 
</UserControl.Resources> 

<Grid> 
    <TreeView ItemsSource="{Binding TreeRoot}" ItemTemplate="{StaticResource TreeNodeTemplate}" /> 
</Grid> 
+0

下面的答案是否可以解決您的問題,山姆?如果是這樣,你能接受最好解決你的問題的答案嗎?如果沒有,你能否提供更多關於缺少的信息?謝謝! – 2016-01-19 13:27:13

回答

4

我覺得你的問題是,您的分層數據模板僅應用於根節點,所以你永遠看不到過去的根的孩子。試試這個:

<UserControl.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}"> 
     <TextBlock Text="{Binding Name}" /> 
    </HierarchicalDataTemplate> 
</UserControl.Resources> 

<Grid> 
    <TreeView ItemsSource="{Binding TreeRoot}"/> 
</Grid> 

其中TreeNode是你的樹節點類的名稱。

2

就像Aviad說的那樣,如果你使用DataType="{x:Type TreeNode}"那麼TreeView將自動使用該模板來處理該類型的任何對象。

如果您的層次結構中有多個類型,則可以指定多個HierarchicalDataTemplates,每個HierarchicalDataTemplates使用它的數據類型。這將讓TreeView以不同的方式處理每種類型。

<HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}"> 
    <TextBlock Text="{Binding Name}" /> 
</HierarchicalDataTemplate> 

<HierarchicalDataTemplate DataType="{x:Type TreeLeaf}"> 
    <TextBlock Text="{Binding Message}" Background="Red" /> 
</HierarchicalDataTemplate> 
9

我有這個問題,並得出結論,我無法將非集合綁定到樹視圖作爲指定根節點的方式。所以我所做的就是做出迅速改變我的模型視圖,並表示根節點1項的集合的屬性。

public class ContainerViewModel 
{ 
    public ObservableCollection<TreeNodeViewModel> RootNodes { get; private set; } 

    public ContainerViewModel() 
    { 
     // Create a single node in the collection of root nodes 
     RootNodes = new ObservableCollection<TreeNodeViewModel>(); 
     RootNodes.Add(new TreeNodeViewModel()); 
    } 
} 

public class TreeNodeViewModel 
{ 
    public ObservableCollection<TreeNodeViewModel> Children { get; set; } 
} 

我上面使用一個ObservableCollection <>但可能會更有意義,使用更便宜的東西就像一個列表<>,因爲你不希望集合改變(至少在你的情況下)。