我有以下界面(你可以看到,我正在调整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和其他地方看了很多类似的问题,但似乎都没有解决我的问题。几个问题:
DataContext
,而不是TreeView本身?答案 0 :(得分:0)
为什么我需要设置DataContext 父窗口,而不是 TreeView本身?
你不需要。您可以在TreeView
本身设置数据上下文:
<TreeView x:Name="tree"...>
-
IViewModel model = ViewModelFactory.GetTopLevelViewModel();
tree.DataContext = model;
为什么没有出现在 树视图?
TreeView
是ItemsControl
。为了使其显示您需要将其ItemsSource
属性分配给集合。
我该如何解决?
例如,您可以将DataContext
设置为IViewModel
个项目的集合,而不是单个项目:
IViewModel model = ViewModelFactory.GetTopLevelViewModel();
tree.DataContext = new IViewModel[] { model };