Могу ли я связать WPF TreeView с одним корневым узлом? - PullRequest
15 голосов
/ 30 января 2010

Скажем, у меня есть двоичное дерево, где корнем структуры данных является просто узел дерева. Для каждого узла дочерние элементы доступны через свойство Children. Вот что я попробовал. TreeRoot является свойством унаследованного контекста данных, но это один узел (не коллекция).

<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>

Ответы [ 3 ]

9 голосов
/ 30 июня 2010

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

4 голосов
/ 31 января 2010

Я думаю, что ваша проблема в том, что ваш шаблон иерархических данных применяется только к корневому узлу, поэтому вы никогда не увидите ничего, кроме дочерних корневых. Попробуйте вместо этого:

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

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

Где TreeNode - имя класса вашего узла дерева.

3 голосов
/ 31 января 2010

Как сказала Авиад, если вы используете 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>
...