c# - 多层次数据模板

标签 c# wpf treeview

我在 WPF 中使用 TreeView 时遇到一些问题。 我有三个相互包含的集合。 所以,我有一个 Group 类型,其中有一个 MasterActions ObservableCollection。 在 MasterAction 中有一个 SlaveActions ObservableCollection。 Group、MasterAction 和 SlaveAction 类都有一个 Description 属性。 我想将它们绑定(bind)到 TreeView。 我尝试了 HierarchicalDataTemplate 构造,但它不起作用。

有Xaml代码:

<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>

隐藏代码:

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() 是一个重载方法。它管理构建树的所有三个参数。

group1_description
    masterAction11
        slaveAction111
        slaveAction112
    masterAction12
    masterAction13
        slaveAction131
group2_description
    masterAction21
    masterAction22
        slaveAction221
        slaveAction222
        slaveAction223
        slaveAction224

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

enter image description here

如何才能让所有MasterActions和SlaveActions描述出现在右侧节点下?

提前致谢。

最佳答案

看起来您似乎试图使用 HierarchicalDataTemplate 进入太深的一层。您将代码中的 ItemsSource 设置为 Groups

TreeViewResult.ItemsSource = handler.Groups;

实际上如何设置它(在代码中或通过绑定(bind))并不重要,更重要的是顶级项目是一个Group并且您绑定(bind)顶级HierarchicalDataTemplate.ItemsSource。而不是将所有内容向上移动一个级别并将顶级 ItemsSource 绑定(bind)到 MasterActions,下一个级别到 SlaveActions 以及最低级别可以是简单的 DataTemplate 将显示没有子节点的 Description

<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

关于c# - 多层次数据模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23896442/

相关文章:

c# - GestureRecognizer 不适用于 ios xamarin.forms

c# - 缓存 mysql 结果 C#

c# - 绑定(bind)到 List<> 依赖属性的 WPF 上下文菜单

c# - 为 MVVM 选择的多个列表框/集合项

c# - 在选定单元格中带有复选框的 Infragistics UltraTree

c# - 在运行时编译代码时添加额外的引用

c# - 如果 UDP 数据包在线上,我能保证在应用层得到它们吗?

c# - WPF,将键盘焦点提供给以前折叠的控件

移动节点后 C# Treeview 不刷新

delphi - 如何更改 TreeView 节点高度,在节点中绘制 3 条线