将任意深度树绑定到TreeView

时间:2011-02-15 17:27:18

标签: .net wpf treeview binding

我有以下界面(你可以看到,我正在调整MVVM模式):

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

我想将此数据类型绑定到树视图,具有单个顶级节点和任意深度。 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>

并将顶级节点设置为Window的DataContext:

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

然而,树视图中没有出现任何内容。我在SO和其他地方看了很多类似的问题,但似乎都没有解决我的问题。几个问题:

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

1 个答案:

答案 0 :(得分: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 };