2011-02-15 91 views
0

我有如下界面(正如你所看到的,我适应MVVM模式了一下):绑定arbitary深度树一个TreeView

public interface IViewModel { 
    string Header { get; } 
    IEnumerable<IViewModel> Nodes { get; } 
} 

我想这个数据类型绑定到一个TreeView ,具有单个顶部节点和任意深度。 Header是要在每个节点中显示的文本,并且Nodes是子节点。

我有以下XAML:

<TreeView ItemsSource="{Binding}"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type ViewModel:IViewModel}" ItemsSource="{Binding Nodes}"> 
      <TextBlock Text="{Binding Header}" /> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

和设置顶级节点到窗口的DataContext:

IViewModel model = ViewModelFactory.GetTopLevelViewModel(); 
DataContext = model; 

但是,没有出现在树视图。我在SO和其他地方看过不少类似的问题,但没有一个能解决我的问题。几个问题:

  1. 为什么我需要设置父窗口的DataContext,而不是TreeView本身?
  2. 为什么树形视图中没有任何东西出现?
  3. 我该如何解决?
+0

我认为hierarchacaldatatemplate将符合实际的数据类型,而不是接口类型,我可能是错的 – Jimmy 2011-02-15 17:35:53

回答

0

为什么我需要设置父窗口的DataContext的 ,而不是 TreeView控件本身?

你不需要。您可以设置在TreeView本身的数据上下文:

<TreeView x:Name="tree"...> 

-

IViewModel model = ViewModelFactory.GetTopLevelViewModel(); 
tree.DataContext = model; 

为什么没有在 树状出现?

TreeViewItemsControl。为了使其显示某些内容,您需要将其ItemsSource属性分配给集合

我该如何解决?

例如,您可以将DataContext设置为IViewModel项目,而不是单个项目的集合:

IViewModel model = ViewModelFactory.GetTopLevelViewModel(); 
tree.DataContext = new IViewModel[] { model };