1

我有两个带有有效负载实体的多对多,如下所示:

实体快照

因此,要使用零件号制作存储在 MasterPartNumber 中的组件MasterPartNumber.pn,我使用导航属性ParentBOMs,它由关系给出: MasterPartNumber.pnID = MasterPartsList.parentPnID。这给了我该父程序集下的所有子 pnID。

要获取该组件的子零件编号,我使用由ChildPn定义的导航属性MasterPartsList.pnID = MasterPartNumber.pnID

请注意,顶级装配项目未在 MasterPartsList 中列出(它们的 parentPnID 为空)。

我的 TreeView HierarchicalDataTemplate 绑定是:

<TreeView x:Name="AssemblyTreeView"
          ItemsSource="{Binding BOMItems}">
  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate DataType="{x:Type local:MasterPartNumber}"
                              ItemsSource="{Binding ParentBOMs.ChildPn}">
      <TextBlock Text="{Binding pn}" />
    </HierarchicalDataTemplate>
  </TreeView.ItemTemplate>
</TreeView>

我认为这是正确的。我可以单步调试调试器,并看到为每个具有子信息的项目填充了整个 BOMItem 导航属性 (ParentBOM.ChildPn.pn)。

为什么我无法在 TreeView 中看到这些子属性?!

What I should get:

Root Assembly
--Sub Assembly
----Sub Assembly
------Child (n-levels deep)

我实际得到的:

Root Assembly

我需要额外的转换器吗?我是否需要进一步定义我的 ObservableCollection 对象包装器的“getter”?

Known possible sources of the problem:
1. Entity Framework is lazy loading, and just hasn't loaded the navigation properties I see in
   the debugger being populated. (No, set LazyLoading to false.)
2. My HierarchicalDataTemplate isn't probing for children just on the fact that it has children
   -- aka it only understands to switch the binding path when a new DataType is available, or 
   something like that. (Not likely, because I've seen HierarchcialDataTemplates for self-referencing entities of a single entity type.)

What I have right:
1. I can cascade down the binding route I told my TreeView to take in the debugger. 
    Parent `pn` is populated as well as its `ParentBOMs.ChildPn.pn`. 

请帮忙!谢谢 !

4

1 回答 1

0

无法了解预期的输出应该是什么?你能画出树然后贴出来吗?

您可能必须为要呈现的域类型创建包装 VM 类型。说.. MasterPartVM。您现在可以使用 2 条路由的逻辑定义属性,例如 Children。您的分层数据模板将始终使用此属性扩展下一个级别。

这将使您有责任在 MasterPartVM.Children 的实施中找到合适的孩子——您似乎已经确定了这一点。如果我误解了这个问题,请告诉我..

例如,在链接的帖子中,您可以看到我使用包装器属性来组合子组和条目来整理单个列表。

这是另一个例子

public class MyPart
    {
        public string Name { get; set; }
        public bool IsRoot { get; set; }
        public string[] ChildNames { get; set; }
        public IList<MyPart> Children { 
            get {
                if (IsRoot)
                    return ChildNames.Select(c => new MyPart { Name = c, ChildNames =new[]{c} }).ToList();
                else
                    return new List<MyPart>{new MyPart { Name = "No more children" }};
        } }
    }

MyPartsCollection = new ObservableCollection<MyPart>();
            MyPartsCollection.Add(new MyPart
            {
                Name = "Root1",
                IsRoot = true,
                ChildNames = new []{"Item1", "Item2", "Item3"}
            });
<TreeView ItemsSource="{Binding MyPartsCollection}">
  <TreeView.ItemTemplate>
    <HierarchicalDataTemplate DataType="{x:Type local:MyPart}"
                              ItemsSource="{Binding Children}">
      <TextBlock Text="{Binding Name}" />
    </HierarchicalDataTemplate>
  </TreeView.ItemTemplate>
</TreeView>
于 2013-04-22T13:42:32.683 回答