我想创建一个自定义的“向导”-Control。
所以我从Selector派生了一个“向导”,并创建了一个派生自HeaderedContentControl的“WizardPage”。当我将“WizardPages”直接添加到“向导”的内容本身时,一切正常。
在代码中:这是有效的
<ctrl:Wizard>
<ctrl:WizardPage Header="Page 1" Content="Some Stuff" />
</ctrl:Wizard>
然后我想:嘿,如果你可以在Wizard的内容中添加随机内容并且如果需要的话就会创建一个包装器就好了,就像带有ListBoxItems的ListBox一样(我肯定需要一个包装器,因为WizardPage需要属性“CanLeavePage”和“AlreadyVisited”)。
在代码中:我希望这是有效的(组是一个列表,我可以在某处向WizardPage模板)
<ctrl:Wizard ItemsSource="{Binding Groups}" />
所以我试过了:
protected override bool IsItemItsOwnContainerOverride(object item)
{
return item is WizardPage;
}
protected override DependencyObject GetContainerForItemOverride()
{
return new WizardPage();
}
当我在这两个方法上设置断点时,我可以看到IsItemItsOwnContainer被调用,但GetContainerForItemOverride永远不会被调用。
我在这里缺少什么?
概念如下:
答案 0 :(得分:1)
检查完代码后,确定无法正常工作。你的Wizard类是一个Selector,所以它是一个ItemsControl,但在你的向导控件模板中你没有使用任何ItemsControl东西,在你使用ListBox的模板里面,这是一个ItemsControl本身,然后你将Wizards ItemsSource绑定到列表框的ItemsSource。所以在ListBox中现在调用ItemContainerGenerator来生成ListBoxItems,因为有效的列表框正在完成所有的工作,而向导除了重新路由ItemsSource属性之外什么都不做。
您需要大大修改您的向导模板才能使其正常工作。顺便说一句。您可以从ListBox轻松派生Wizard类。