2012-04-02 149 views
0

我并不都熟悉标记。我试图用TreeView来测试DataTemplate。基本上我试图创建一个名为parents的列表,向其中添加2个元素,然后创建两个子项并将它们添加到列表中的父项之一,最后将父列表绑定到TreeView。但我不知道如何引用p1, p2里面的列表。现在我想我不应该用xaml浪费我的时间,并且应该在代码背后做到这一点。有任何想法吗?如何使用子集合制作父元素集合

<Window.Resources> 
    <local:Parent Name="Parent 1" x:Key="p1"/> 
    <local:Parent Name="Parent 2" x:Key="p2"/> 
    <x:ArrayExtension Type="local:Parent" x:Key="parents"> 
     <!-- Can't refer p1 and p2 from here :(-->   
    </x:ArrayExtension> 

    <local:Child ChildName="Child 1" Parent="{StaticResource ResourceKey=p1}"/> 
    <local:Child ChildName="Child 1" Parent="{StaticResource ResourceKey=p1}"/> 
</Window.Resources> 

<Grid> 
    <StackPanel VerticalAlignment="Center"> 
     <TreeView ItemsSource="{Binding Source={StaticResource ResourceKey=p1}}" /> 
    </StackPanel> 
</Grid> 

这两个类:

public class Parent 
{ 
    public string Name { get; set; } 
    public IList<Child> Children { get; set; } 

    public Parent() 
    { 
     Children = new List<Child>(); 
    } 
} 

public class Child 
{ 
    public string ChildName { get; set; } 
    private Parent _parent; 
    public Parent Parent 
    { 
     get 
     { 
      return _parent; 
     } 
     set 
     { 
      _parent = value; 
      if (value != null) 
      { 
       value.Children.Add(this); 
      } 
     } 
    } 
} 

回答

1
  1. 没有必要把TreeViewStackPanelStackPanel堆栈元素,但在你的情况下,它只有一个元素 - TreeView
  2. 您需要为TreeView定义HierarchicalDataTemplate。这里有一个例子:

<HierarchicalDataTemplate x:Key="TreeViewTemplate" ItemsSource="{Binding Children}" > 
    <!-- Some markup here --> 
</ HierarchicalDataTemplate> 

这里ItemsSource属性告诉什么财产绑定数据containes当前节点的孩子的集合。它递归地应用于该孩子的每个孩子和每个孩子,等等。


最后,关于在xaml中定义数据。有几种方法,但在这种情况下,我宁愿从Parent中派生出ParentTest,并创建默认的c'tor来填充Children集合。