无法绑定到WPF中的树视图

时间:2015-02-11 23:43:36

标签: c# wpf xaml data-binding treeview

我正在尝试创建一个表示文件数据的树视图。文件数据具有组织成三个不同部分的数据包:标题信息,操作标题和操作数据。 “标题信息”和“操作标题”中的数据包深度为一级,而“操作数据”中的数据包则分组为列表,因此我认为通过使其达到额外级别更容易组织。这样你可以弹出打开数据,查看列表,然后弹出那些打开以查看单个数据包。

这是我的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信息和操作头的数据包,以及Operation数据的列表名称,但没有显示子包。它们存在于Children.DataPackets对象中。

这是投入输出窗口: BindingExpression路径错误:&#39;儿童&#39;未在&#39; object&#39;

上找到的属性

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

enter image description here

儿童姓名属性缺少二级

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

    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>