如何为WPF TreeView设置DataTemplate以显示列表的所有元素?

Onu*_*nur 4 c# data-binding wpf treeview datatemplate

我想在WPF中使用TreeViews可视化以下数据结构:

class MyDataContext
{
    ICollectionView Outers {get;set;}
    //...
}

class Outer
{
    string Name {get;set;}
    IEnumberable<Inner> Actions {get;set;} 
}


class Inner
{
    string Description {get;set;}
    Command OnClick {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的尝试:

<!-- DataContext is MyDataContext at this  point -->
<TreeView ItemsSource="{Binding Path=Outers}">
    <TreeView.Resources>
        <DataTemplate DataType="{x:Type myns:Outer}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Path=Name}"/>

                <TreeView ItemsSource="{Binding Path=Actions}" >
                    <DataTemplate DataType="{x:Type myns:Inner}">
                        <Button Command={Binding Path=OnClick}>
                            <TextBlock Text="{Binding Path=Description}"/>
                        </Button>
                    </DataTemplate>
                </TreeView>
            </StackPanel>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>
Run Code Online (Sandbox Code Playgroud)

由于我得到以下信息,因此访问此类访问有问题InvalidOperationException:

Operation is not valid while ItemsSource is in use. Access and modify elements with ItemsControl.ItemsSource instead.
Run Code Online (Sandbox Code Playgroud)

如果我删除内部TreeView,则没有异常(当然也没有按钮).

Onu*_*nur 6

我使用了Mateusz提到的页面(HierarchicalDataTemplate),在阅读了这个问题的答案之后:将Collection绑定到StackPanel我发现了一个能够达到我想要的解决方案:

这里的球员(3级)和球队在同一排(2级):

<TreeView ItemsSource="{Binding League}">
    <!-- Conference template -->
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Teams}">
            <TextBlock Foreground="Red" Text="{Binding Name}" />
            <!-- Team template -->
            <HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name}"/>
                        <ItemsControl ItemsSource="{Binding Players}">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel Orientation="Horizontal">
                                    </StackPanel>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                            <ItemsControl.ItemTemplate>
                                <DataTemplate>
                                    <Button Content="{Binding }"/>
                                </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </StackPanel>
                </DataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>
Run Code Online (Sandbox Code Playgroud)

结果


Mat*_*ski 1

请尝试将 HierarchicalDataTemplate 与 TreeView 一起使用。

分层数据模板