我想使用代表典型树节点的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。也许,您知道这个问题的另一种解决方案吗?
答案 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>
一开始它还有一些工作,但如果你想做更复杂的操作,如自动选择和扩展,它可以节省你几个小时的时间。