2010-06-08 65 views
1

我正在尝试创建一个ItemsControl,它在项目之间有一个分隔符,例如用于创建导航面包屑的控件。我希望控件是完全通用的。Instantiate ItemsPanelTemplate

我的原始方法是创建扩展ItemsControl,添加一个SeparatorTemplate属性,然后让该类添加分隔符到ItemsControl的ItemsHost。这种方法的问题是,如果向容器面板添加额外的项目,ItemGenerator会感到困惑,并且项目出现故障,并且无法正确删除。

因此,我的第二个计划是创建一个全新的控件,以模拟ItemsControl,但是我遇到的问题是我找不到实例化ItemsPanelTemplate的方法。我想提供一个像ItemsControl一样的ItemsPanel属性,但是我不能从那个模板创建一个面板。

任何人都可以想出一种方法来实例化一个ItemsPanelTemplate或在不破坏ItemGenerator的情况下将控件添加到ItemsControl的面板吗?

回答

0

嗯,我没有尝试过自己,但我原以为你会重写GetContainerForItemOverride来实现这个目标。

您可以创建一个新的BreadCrumbItem控制这是一个模板ContentControl已在其默认模板中的典型ContentPresenter,无论您想用默认值作为分隔符都在一个GridStackPanel使用。

GetContainerForItemOverride生成此BreadCrumbItem的新实例,将其ContentTemplate从您ItemsControl衍生的ItemTemplate属性(在BreadCrumb控制?)。

您的BreadCrumb控件也会暴露BreadCrumbItemStyle属性,您分配给您在GetContainerForItemOverride期间创建的BreadCrumbItem

为了完整起见,您可能还需要在您的BreadCrumb控件中实施其他*Container*Override方法。

+0

我希望避免必须在ItemContainer中包含分隔符。如果我将它包含在默认模板中,那么我需要管理最后一项是什么,这样我可以使分隔符在最后一项中不可见。将它包含在ItemContainer中的另一个问题是它不会遵循ItemsPanel的布局。我想能够提供任何ItemsPanel并正确地布置它,就好像它是另一个项目一样。 – Stephan 2010-06-08 15:33:20

+0

@Stephan:好点。不管解决方案如何,包括“LastItem”视觉状态都可能有助于额外的分隔符“管理”是不可避免的。至于设计师替代默认面板的选择,他们只需要通过'BreadCrumbItemStyle'属性替换'BreadCrumbItem'模板。我个人认为这是一个合理的地方。如果消费者需要,控制系统可以开箱即用,并且可以进行无法识别的设计。 – AnthonyWJones 2010-06-08 15:58:33

+0

嗯,我决定重载ItemsSource,然后将分隔符插入到列表中,并将其推送到实际的ItemsSource中。我知道这可能不是最安全的方式,因为有人可以自己访问'base.ItemsSource',但它给了我想要的东西。谢谢你的帮助。 – Stephan 2010-06-09 12:53:10

相关问题