我正在尝试创建一个ItemsControl
,它在项目之间有一个分隔符,例如用于创建导航面包屑的控件。我希望控件是完全通用的。Instantiate ItemsPanelTemplate
我的原始方法是创建扩展ItemsControl
,添加一个SeparatorTemplate属性,然后让该类添加分隔符到ItemsControl的ItemsHost
。这种方法的问题是,如果向容器面板添加额外的项目,ItemGenerator会感到困惑,并且项目出现故障,并且无法正确删除。
因此,我的第二个计划是创建一个全新的控件,以模拟ItemsControl
,但是我遇到的问题是我找不到实例化ItemsPanelTemplate
的方法。我想提供一个像ItemsControl
一样的ItemsPanel属性,但是我不能从那个模板创建一个面板。
任何人都可以想出一种方法来实例化一个ItemsPanelTemplate
或在不破坏ItemGenerator的情况下将控件添加到ItemsControl
的面板吗?
我希望避免必须在ItemContainer中包含分隔符。如果我将它包含在默认模板中,那么我需要管理最后一项是什么,这样我可以使分隔符在最后一项中不可见。将它包含在ItemContainer中的另一个问题是它不会遵循ItemsPanel的布局。我想能够提供任何ItemsPanel并正确地布置它,就好像它是另一个项目一样。 – Stephan 2010-06-08 15:33:20
@Stephan:好点。不管解决方案如何,包括“LastItem”视觉状态都可能有助于额外的分隔符“管理”是不可避免的。至于设计师替代默认面板的选择,他们只需要通过'BreadCrumbItemStyle'属性替换'BreadCrumbItem'模板。我个人认为这是一个合理的地方。如果消费者需要,控制系统可以开箱即用,并且可以进行无法识别的设计。 – AnthonyWJones 2010-06-08 15:58:33
嗯,我决定重载ItemsSource,然后将分隔符插入到列表中,并将其推送到实际的ItemsSource中。我知道这可能不是最安全的方式,因为有人可以自己访问'base.ItemsSource',但它给了我想要的东西。谢谢你的帮助。 – Stephan 2010-06-09 12:53:10