Wpf 动态填充树视图的更好方法
我想使用代表典型树节点的节点动态构造一个TreeView。节点看起来像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
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>