【发布时间】:2013-01-02 07:35:52
【问题描述】:
这个让我难过。我们有一个自定义 ItemsControl,它使用自定义容器和自定义面板作为其 ItemsHost。现在,面板具有容器渲染所需的一些指标。由于它们是可视树中面板的直接子级,您可能会认为容器的 Parent 属性会返回面板,但事实并非如此!
我还在标准 ListBox 上使用 Snoop 确认了这一点,所以这不是我们的代码所独有的,显然是 ItemsControls 的所有容器。
现在我知道我可以使用 VisualTreeHelper 来获取可视父级(这是我需要的),但是为什么父级不是是面板?
如果参数是面板只是可视树的一部分,而父级是为逻辑树保留的,那么父级不是 ItemsControl 吗?
如果容器的参数也是 ItemsControl 的可视化树的一部分,而不是逻辑树的一部分,那么为什么容器中托管的内容会将容器作为其 Parent 属性返回?
这意味着,如果您从数据项遍历逻辑树,您会在容器处停下来,这可以解释为什么我们从容器到面板的绑定没有按预期工作。 (我相信绑定是基于逻辑层次结构而不是视觉层次结构,但我必须进行测试才能确定。)
【问题讨论】:
-
问得好,我也一直想知道。附注:您也可以使用
ItemsControl.GetItemsOwner获取ItemsControl。 -
是的,但如果不明确编写转换器,您将无法在绑定中执行此操作。使用 RelativeSource 搜索树似乎失败了;我的猜测是出于我指出的确切原因......容器的父级是 Null。
-
这确实是一个好问题。我相信会读到一些 listboxitem 有一个非公共成员来获取父级的地方。但是,如果您使用自定义容器,那么您将负责在创建时设置父容器。
标签: wpf parent itemscontrol visualtreehelper