无法绑定到 WPF 中的树视图

Having trouble binding to a treeview in WPF

我正在尝试创建一个表示文件数据的树视图。文件数据的数据包分为三个不同的部分:Header 信息、操作 Header 和操作数据。 Header Info 和 Operation Header 中的数据包是一层深的,而 Operation Data 中的数据包被分组到列表中,所以我认为通过增加一层来组织起来会更容易。这样您就可以弹出打开数据,查看列表,然后弹出打开的数据以查看单个数据包。

这是我的 xaml:

<TreeView ItemsSource="{Binding TreeViewItems}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding TreeNodes}">
                    <TextBlock Text="{Binding Name}" />

                    <HierarchicalDataTemplate.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
                            <TextBlock Text="{Binding Name}" />
                            
                                    <HierarchicalDataTemplate.ItemTemplate>
                                        <HierarchicalDataTemplate>
                                            <TextBlock Text="{Binding DataPackets.ItemName}"/>                                                 
                                        </HierarchicalDataTemplate>
                                    </HierarchicalDataTemplate.ItemTemplate>

                        </HierarchicalDataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>

                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

下面是我们尝试绑定到分层数据模板的代码:

                var childData = new Children();

                result.OperationData.ToList().ForEach(x => childData.DataPackets.Add(x));

                
                if (result.HeaderInfo.Any())
                {
                    TreeViewItems.Add(new TreePair() { TreeNodes = result.HeaderInfoProperties.ToList(), Name = "Header Info" });
                }
                TreeViewItems.Add(new TreePair() { TreeNodes = result.OperationHeaderProperties.ToList(), Name = "Operation Header" });
                TreeViewItems.Add(new TreePair() { TreeNodes = result.OperationDataProperties.ToList(), Children = new List<Children> {childData}, Name = "Operation Data" });

和类

public class TreePair
    {
        

        public TreePair()
        {               
            TreeNodes = new List<PropertyInfo>();
            Children = new List<Children>();
        }

        public List<Children> Children { get; set; }

        public List<PropertyInfo> TreeNodes { get; set; }

        public string Name { get; set; }
    }

    public class Children
    {
        public Children()
        {
            DataPackets = new List<DataPacketBase>();
        }

        public string Name { get; set; }

        public List<DataPacketBase> DataPackets { get; set; }
    }

我显示了 Header 信息和操作 header 的数据包,以及操作数据的列表名称,但是 child 数据包的 none出现。它们存在于 Children.DataPackets object.

这是输出 window: BindingExpression 路径错误:在 'object'

上找不到 'Children' 属性

第二个 TextBlock 是正确的,但是 Children 没有找到 ItemSource,但是列表中正在填充项目。

Children 姓名 属性 二级缺失

绑定找不到 Children,因为它正在 PropertyInfo 对象上查找它。 ChildrenTreeNodes 是树中的兄弟姐妹,两者之间没有 Child/Parent 关系,因此 HierarchicalDataTemplate 在尝试查找 Children 对象时被破坏属于 PropertyInfo 对象。

如果您的对象层次结构正确,那么您将需要一个 CompositeCollection 可以将 TreeNodes 和 Children 对象组合成一个集合。

    private CompositeCollection _treeNodeChildCollections;
    public CompositeCollection TreeNodeChildCollections
    {
        get
        {
            if (_treeNodeChildCollections == null)
            {
                _treeNodeChildCollections = new CompositeCollection();
                var cc1 = new CollectionContainer();
                cc1.Collection = Children;
                var cc2 = new CollectionContainer();
                cc2.Collection = TreeNodes;

                _treeNodeChildCollections.Add(cc1);
                _treeNodeChildCollections.Add(cc2);
            }

            return _treeNodeChildCollections;
        }
    }

然后绑定到xaml。

    <TreeView ItemsSource="{Binding TreeViewItems}">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding TreeNodeChildCollections}">
                <TextBlock Text="{Binding Name}" />
                <HierarchicalDataTemplate.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding DataPackets}">
                        <TextBlock Text="{Binding Name}"/>
                        <HierarchicalDataTemplate.ItemTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding ItemName}"/>
                            </DataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>