首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多重HierarchicalDataTemplate

多重HierarchicalDataTemplate
EN

Stack Overflow用户
提问于 2014-05-27 18:25:36
回答 1查看 5.6K关注 0票数 1

我在WPF中的TreeView有一些问题。我有三个互相包含的藏品。所以,我有一个组类型,其中有一个MasterActions ObservableCollection。在MasterAction中有一个SlaveActions ObservableCollection。组、MasterAction和SlaveAction类具有描述属性。我想将它们绑定到TreeView。我尝试过HierarchicalDataTemplate结构,但它不起作用。

有Xaml代码:

代码语言:javascript
复制
<TreeView x:Name="TreeViewResult" HorizontalAlignment="Stretch" ItemsSource="{Binding}" VerticalAlignment="Stretch"  Margin="10,10,10,10" >
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Groups}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Margin="3" Text="{Binding Description}"/>
            </StackPanel>
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding MasterActions}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Description}"/>
                    </StackPanel>
                    <HierarchicalDataTemplate.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding SlaveActions}">
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding Description}"/>
                            </StackPanel>
                        </HierarchicalDataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

代码背后:

代码语言:javascript
复制
Handler handler = new Handler();
Group group1 = new Group("group1_description");
MasterAction masterAction11 = new MasterAction("masterAction11");
SlaveAction slaveAction111 = new SlaveAction("slaveAction111");
SlaveAction slaveAction112 = new SlaveAction("slaveAction112");
MasterAction masterAction12 = new MasterAction("masterAction12");
MasterAction masterAction13 = new MasterAction("masterAction13");
SlaveAction slaveAction131 = new SlaveAction("slaveAction131");
handler.Add(group1);
handler.Add(masterAction11);
handler.Add(slaveAction111);
handler.Add(slaveAction112);
handler.Add(masterAction12);
handler.Add(masterAction13);
handler.Add(slaveAction131);
Group group2 = new Group("group2_description");
MasterAction masterAction21 = new MasterAction("masterAction21");
MasterAction masterAction22 = new MasterAction("masterAction22");
SlaveAction slaveAction221 = new SlaveAction("slaveAction221");
SlaveAction slaveAction222 = new SlaveAction("slaveAction222");
SlaveAction slaveAction223 = new SlaveAction("slaveAction223");
SlaveAction slaveAction224 = new SlaveAction("slaveAction224");
handler.Add(group2);
handler.Add(masterAction21);
handler.Add(masterAction22);
handler.Add(slaveAction221);
handler.Add(slaveAction222);
handler.Add(slaveAction224);
TreeViewResult.ItemsSource = handler.Groups;

Handler.Add()是一个重载的方法。它管理所有的三个参数来构造树。

代码语言:javascript
复制
group1_description
    masterAction11
        slaveAction111
        slaveAction112
    masterAction12
    masterAction13
        slaveAction131
group2_description
    masterAction21
    masterAction22
        slaveAction221
        slaveAction222
        slaveAction223
        slaveAction224

当我运行代码时,它会生成下一个:

如何在正确的节点下显示所有MasterActions和SlaveActions描述?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-27 18:34:46

看起来,如果您试图在HierarchicalDataTemplate中达到一个层次太深的程度。在代码中将ItemsSource设置为Groups

代码语言:javascript
复制
TreeViewResult.ItemsSource = handler.Groups;

实际上,您如何设置它(在代码中或通过绑定)并不重要,更重要的是顶级项是Group,并且将顶级HierarchicalDataTemplate.ItemsSource绑定到Groups。而不是将所有东西向上移动一个级别,并将顶级ItemsSource绑定到MasterActions,然后将下一个级别绑定到SlaveActions和最低层,这样就可以使用简单的DataTemplate来显示没有子节点的Description

代码语言:javascript
复制
<TreeView 
    x:Name="TreeViewResult" 
    HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch"
    Margin="10,10,10,10" >
    <!-- top node will be a Group -->
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding MasterActions}">
            <TextBlock Margin="3" Text="{Binding Description}"/>
            <!-- child node will be a MasterAction -->
            <HierarchicalDataTemplate.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding SlaveActions}">
                    <TextBlock Text="{Binding Description}"/>
                    <!-- leaf will be a SlaveAction -->
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding Description}"/>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </HierarchicalDataTemplate.ItemTemplate>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

而且,与您的问题无关,但是由于您显示单个TextBlock,所以不需要StackPanel

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23896442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档