Лучший способ динамически заполнить TreeView - PullRequest
0 голосов
/ 08 сентября 2010

Я хочу динамически построить TreeView, используя Node, который представляет типичный узел дерева.Узел выглядит как

class Node
{
    public Node(string cont) {
        Content = cont;
        Children = new List<Node>();
    }

    public string Content { get; set; }
    public List<Node> Children { get; set; }
    public bool IsLeaf {
        get { return Children.Count == 0; }
    }
    public bool IsVisible {
        get { return true; }
    }
}

Для того, чтобы я написал простой обход дерева, который добавляет TreeViewItems

   void XmlTreeTraversal(DataPoolNode curNode, TreeViewItem curViewNode) {
        if (curNode.IsLeaf)
            return;

        var contentNode = (DataPoolNode)curNode;
        foreach (var node in contentNode.Children) {
            TreeViewItem childViewNode = AddNewNodeToTreeView(node.Content, curViewNode);

            XmlTreeTraversal(node, childViewNode);
        }
    }

    TreeViewItem AddNewNodeToTreeView(string description, TreeViewItem curViewNode) {
        TreeViewItem newTVI = new TreeViewItem();
        newTVI.Header = description;
        curViewNode.Items.Add(newTVI);
        return newTVI;
    }

Проблема с подходом состоит в том, что данные и представление переплетены.Так что это не соответствует MVVC.Возможно, вы знаете другое решение этой проблемы?

1 Ответ

0 голосов
/ 08 сентября 2010

Не создавайте дерево самостоятельно. TreeView-control - это один из контроллеров, который получает большую выгоду от DataBinding и даже больше от MVVM. Без этого может быть больно работать. С DataBinding и MVVM использовать TreeView очень просто:

У вас уже есть хороший источник для TreeView. Это ваш класс Node. Установите список для корневого узла в качестве ItemsSource вашего TreeView ...

m_treeView.ItemsSource=new List<Node>(){yourRootNode};

... Создайте шаблон HierarchicalDatraTemplate для ваших узлов. Что-то вроде ...

<HierarchicalDataTemplate x:Key="TreeViewItem_HierarchicalDataTemplate" ItemsSource="{Binding Children}" >
         <TextBlock Text="{Binding Content}"  />                
</HierarchicalDataTemplate>

... и соответственно задайте шаблон элементов TreeView ...

<TreeView Name="m_treeView" ItemTemplate="{StaticResource TreeViewItem_HierarchicalDataTemplate}" .../>

Если Node-класс уже является ViewModel, может быть интересно также включить свойство IsSelected и IsExpandend и привязать к нему свойства ItemsContainerStyle (не забывайте о событии INotifyPropertyChanged) ..

<TreeView.ItemContainerStyle>                
    <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
        <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
    </Style>
</TreeView.ItemContainerStyle>

В начале это немного больше работы, но это может сэкономить вам часы времени, если вы затем захотите выполнять более сложные операции, такие как автоматический выбор и расширение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...