如何在XAML中使用父级的ItemsHost for HierarchicalDataTemplate?

时间:2011-07-19 07:24:57

标签: c# wpf recursion hierarchicaldatatemplate visual-tree

我有一个类似于树或菜单的数据结构,我希望在Panel(特别是自制的PolarPanel)中显示,但所有项目必须是同一面板的VisualChildren。

如果我定义HierarchicalDataTemplate,我需要创建一个ItemsControls并将其指定为IsItemsHost,或者我在这里弄错了?我能以某种方式引用父母的ItemsHost吗?

    <HierarchicalDataTemplate
        DataType="{x:Type local:ItemsCollection}"
        ItemsSource="{Binding Children}"
        >
        <!--/* "virtual" ItemsHost referencing the parent's ItemsHost? */-->
    </HierarchicalDataTemplate>

(我的第一个解决方法是在根节点中有一个GetAllTheChildren属性,以递归方式返回SelectedChild的所有子节点和所有子节点。这不容易与ObservableCollection一起使用,因为更改有冒泡到根目录再次刷新GetAllTheChildren(重新加载的项目数量超过了必要的数量)。)

我知道我可以通过在同一个父级中创建和绘制项目的视图来实现代码隐藏,但我正在寻找一种不错的WPF,间接的,自动的方式。

编辑:我现在正在使用改进的解决方法,其中所有ItemControls / Panels都是相互叠加的。这保留了分层方面,这使得它比上面提到的(GetAllTheChildren)更好。但它仍然没有回答我的问题......

这就是图形化的样子:
PolarMenu example http://i51.tinypic.com/2mpxwdi.jpg
请注意分层元素必须如何排列在同一空间中。

对此有一个简洁明了的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我必须承认图形结果很有吸引力,即使我不知道如何使用这种控制!

为了回答你的问题,我从未试图与主持人共享同一个小组,但我认为不可能。这会破坏可视树层次结构模式。任何视觉元素都不能超过父级。

假设每个层次结构级别都映射了他自己的环,我肯定会打赌创建这样一个复合UI的经典方法。毫无疑问,使用HierarchicalTemplates和ItemsControls的便利性,即使它可能是一项复杂的任务。

此外,我不明白你的目标是否会出现某种崩溃,例如普通的树视图。在这种情况下,避免使用经典的WPF方法将是一场噩梦!

我的解决方案是创建一个自定义面板,能够将他们的孩子安排在一个戒指上。

这不是全部。它必须同时创建自定义Control和ItemsControl。第一个将表示必须呈现的环形切片,另一个将表示为生成器。 作为项目持有者的控件将具有两个属性:角度和半径。厚度可以分开。

调用MeasureOverride的面板必须考虑环形嵌套,并相应地设置其子角度和半径。

从我的观点来看,保持控件应该来自ContentControl。这是因为您需要渲染切片的形状,并且该任务应该由此控件完成。任何特定的嵌入式控件(文本,按钮等)都可以作为内容放在里面。

当然,所有这些都是头脑风暴。我不保证这是最好的解决方案,也不能保证原样。

希望它有所帮助。

干杯