2010-01-30 3 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

Был ли какой-либо из нижеприведенных ответов решить вашу проблему, Сэм? Если да, можете ли вы принять ответ, который лучше всего решил вашу проблему? Если нет, можете ли вы предоставить дополнительную информацию о том, чего не хватает? Спасибо! –

ответ

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

Как сказал Авиад, если вы используете DataType="{x:Type TreeNode}", то TreeView автоматически будет использовать этот шаблон для любого объекта этого типа.

Если у вас есть несколько типов в вашей иерархии, вы можете указать несколько 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

Я имел эту проблему и пришли к выводу, что я не мог связать не-коллекцию в TreeView как способ указать корневой узел. Так что я сделал, чтобы быстро изменить мой ModelView и сделать свойство, представляющее корневой узел, коллекцией из 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 <> выше, но может иметь больше смысла использовать что-то дешевле, как список <>, так как вы не ожидаем, что сбор изменить (по крайней мере, в вашем сценарии).