无法绑定到 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
对象上查找它。 Children
和 TreeNodes
是树中的兄弟姐妹,两者之间没有 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>
我正在尝试创建一个表示文件数据的树视图。文件数据的数据包分为三个不同的部分: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
对象上查找它。 Children
和 TreeNodes
是树中的兄弟姐妹,两者之间没有 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>