Wpf 动态填充树视图的更好方法

Wpf 动态填充树视图的更好方法,wpf,mvvm,Wpf,Mvvm,我想使用代表典型树节点的节点动态构造一个TreeView。节点看起来像 class Node { public Node(string cont) { Content = cont; Children = new List<Node>(); } public string Content { get; set; } public List<Node> Children { get; set; } p

我想使用代表典型树节点的节点动态构造一个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; }
    }
}

这种方法的问题在于数据和视图相互交织。所以它不符合MVVC。也许您知道这个问题的另一种解决方案?

不要自己创建树。TreeView控件是从数据绑定中获益匪浅的控件之一,甚至更多地得益于MVVM。如果没有,工作可能会很痛苦。使用数据绑定和MVVM,使用TreeView非常简单:

你已经有了一个很好的来源。它是您的
节点
-类。将根节点的列表设置为TreeView的ItemsSource

m_treeView.ItemsSource=new List<Node>(){yourRootNode};
m_treeView.ItemsSource=newlist(){yourootnode};
…为节点创建HierarchycalDatrateTemplate。类似于

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

…并相应地设置树视图的ItemsTemplate

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

如果节点类已经是ViewModel,那么还可以包括IsSelected和IsExpandend属性,并将ItemsContainerStyle属性绑定到此属性(不要忘记INotifyPropertyChanged事件)


刚开始的时候,它需要做更多的工作,但是如果你想做更复杂的操作,比如自动选择和扩展,它可以节省你几个小时的时间

<TreeView Name="m_treeView" ItemTemplate="{StaticResource TreeViewItem_HierarchicalDataTemplate}" .../>
<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>