动态填充TreeView的更好方法

时间:2010-09-08 06:17:50

标签: wpf mvvm

我想使用代表典型树节点的Node动态构造TreeView。节点看起来像

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 :(得分:0)

不要自己创建树。 TreeView控件是从DataBinding中获得巨大收益的控件之一,甚至更多来自MVVM。没有,这可能是一种痛苦。使用DataBinding和MVVM,使用TreeView非常简单:

您已经拥有了TreeView的良好来源。它是你的Node级。将列表设置为根节点作为TreeView的ItemsSource ...

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

...为您的节点创建一个HierarchicalDatraTemplate。有点像...

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

...并相应地设置TreeView的ItemsTemplate ......

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

如果Node-class已经是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>

一开始它还有一些工作,但如果你想做更复杂的操作,如自动选择和扩展,它可以节省你几个小时的时间。