我正在尝试创建一个表示文件数据的树视图。文件数据具有组织成三个不同部分的数据包:标题信息,操作标题和操作数据。 “标题信息”和“操作标题”中的数据包深度为一级,而“操作数据”中的数据包则分组为列表,因此我认为通过使其达到额外级别更容易组织。这样你可以弹出打开数据,查看列表,然后弹出那些打开以查看单个数据包。
这是我的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,但列表中正在填充项目。
儿童姓名属性缺少二级
答案 0 :(得分:1)
绑定无法找到Children
,因为它正在PropertyInfo
对象上查找它。 Children
和TreeNodes
是树中的兄弟姐妹,两者之间没有子/父关系,因此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>